IndexError: list index out of range en Python
El error que aparece al acceder a una posición que no existe en una lista. Qué significa, las causas típicas, y cómo evitarlo al recorrer listas o leer datos.
Python te detiene con esto:
IndexError: list index out of range
Significa algo muy concreto: intentaste acceder a una posición de una lista (o tupla, o cadena) que no existe. Pediste el elemento número 5 de una lista que solo tiene 3. Vamos a las causas típicas y cómo evitarlo.
Recordatorio: los índices empiezan en 0
La raíz de casi todos estos errores. En Python, el primer elemento de una lista es el índice 0, no el 1. Una lista de 3 elementos tiene los índices 0, 1 y 2 — no hay índice 3.
colores = ["rojo", "verde", "azul"]
print(colores[0]) # rojo
print(colores[2]) # azul
print(colores[3]) # IndexError: list index out of range
El último elemento siempre está en la posición len(lista) - 1. Pedir colores[3] cuando hay 3 elementos es el error clásico de “contar desde 1”.
Causa 1: un bucle que se pasa de rango
numeros = [10, 20, 30]
for i in range(4): # 0, 1, 2, 3 → el 3 no existe
print(numeros[i]) # IndexError al llegar a i = 3
El range(4) genera 0, 1, 2, 3, pero la lista solo llega al índice 2. El arreglo: usa len() para que el rango coincida con la lista:
for i in range(len(numeros)): # 0, 1, 2 — exacto
print(numeros[i])
Mejor aún, en Python casi nunca necesitas el índice para recorrer una lista. Itera directamente sobre los elementos y el problema desaparece:
for numero in numeros: # sin índices, sin IndexError posible
print(numero)
Esta es la forma idiomática y la más segura. Si no necesitas la posición, no uses índices.
Causa 2: acceder al último elemento de una lista que podría estar vacía
def ultimo(lista):
return lista[-1] # el -1 es el último elemento
ultimo([]) # IndexError: la lista está vacía
El índice -1 (muy útil para el último elemento) también falla si la lista está vacía, porque no hay ningún último. El arreglo: comprueba antes de acceder.
def ultimo(lista):
if lista: # True si la lista NO está vacía
return lista[-1]
return None # o lo que tenga sentido en tu caso
El if lista: es la forma pythónica de preguntar “¿tiene elementos?”. Una lista vacía es False; con elementos, True.
Causa 3: dividir texto y asumir cuántas partes hay
Muy común al procesar datos. Divides una cadena y accedes a una parte que a veces no está:
linea = "Ana"
partes = linea.split(",") # ["Ana"] — solo una parte, no había comas
nombre = partes[0] # bien: "Ana"
apellido = partes[1] # IndexError: no hay partes[1]
Esperabas “nombre,apellido” pero esa línea solo traía el nombre. Al leer archivos o datos externos, no todas las líneas tienen el formato que supones. Comprueba antes de acceder:
if len(partes) >= 2:
nombre, apellido = partes[0], partes[1]
else:
nombre = partes[0]
apellido = ""
El diagnóstico
Cuando aparezca IndexError, pregúntate:
- ¿Estoy contando desde 1 en vez de 0? El último índice es
len(lista) - 1. - ¿Mi bucle usa un
rangemás grande que la lista? Usarange(len(lista)), o mejor, itera directamente sobre los elementos. - ¿La lista podría estar vacía? Comprueba con
if lista:antes de acceder a[0]o[-1]. - ¿Dividí un texto y asumí cuántas partes hay? Verifica con
len(partes)antes.
La idea de fondo: nunca accedas a una posición sin estar seguro de que existe. Un if o un cambio a iteración directa evita este error en casi todos los casos.
¿Te sale al trabajar con listas anidadas o matrices, donde el índice doble confunde? Escríbeme desde contacto y lo vemos.