Resolver

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:

  1. ¿Estoy contando desde 1 en vez de 0? El último índice es len(lista) - 1.
  2. ¿Mi bucle usa un range más grande que la lista? Usa range(len(lista)), o mejor, itera directamente sobre los elementos.
  3. ¿La lista podría estar vacía? Comprueba con if lista: antes de acceder a [0] o [-1].
  4. ¿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.

← Más de Resolver