Python IndexError: índice de lista fuera de rango (cómo solucionar este error estúpido)

Si eres como yo, primero intentas las cosas en tu código y vas corrigiendo los fallos a medida que aparecen. Un error frecuente en Python es IndexError: índice de lista fuera de rango. Entonces, ¿qué significa este mensaje de error?

El error “índice de lista fuera de rango” surge si se accedes a índices no válidos en tu lista de Python. Por ejemplo, si intentas acceder al elemento de la lista con el índice 100 pero tu lista sólo consta de tres elementos, Python lanzará un IndexError indicándote que el índice de la lista está fuera de rango.

Python IndexError: List Index Out of Range

¿Quieres desarrollar las habilidades de un profesional experto en Python, mientras te pagan en el proceso? ¡Conviértete en un freelance de Python y pide tu libro Dejando la carrera de ratas con Python en Amazon (Kindle/Impresión)!

Echemos un vistazo a un ejemplo donde surge este error:

lst = ['Alice', 'Bob', 'Carl']
print(lst[3])

El elemento con índice 3 no existe en la lista de tres elementos. ¿Por qué? El siguiente gráfico muestra que el índice máximo de tu lista es 2. La llamada lst[2] recuperaría el tercer elemento de la lista 'Carl'. ¿Intentaste acceder al tercer elemento con el índice 3? Es un error común: el índice del tercer elemento es 2 porque el índice del primer elemento de la lista es 0.

  • lst[0] –> Alice
  • lst[1] –> Bob
  • lst[2] –> Carl
  • lst[3] –> ??? ¿¿¿ Error ???

Prueba tú: Antes de que te diga lo que hay que hacer, intenta arreglar el código en nuestra consola interactiva de Python:

Ejercicio: Corrige el código en la consola interactiva para eliminar el mensaje de error.

¿Cómo arreglar el IndexError en un bucle for? [Estrategia general]

Entonces, ¿cómo puedes arreglar el código? Python te dice en qué línea y en qué lista ocurre el error.

Para determinar el problema exacto, comprueba el valor del índice justo antes de que se produzca el error. Para conseguirlo, puedes imprimir el índice que origina el error antes de utilizarlo en la lista. De este modo, tendrás el índice erróneo en la consola justo antes del mensaje de error.

Aquí hay un ejemplo de código incorrecto que hará que aparezca el error:

# WRONG CODE
lst = ['Alice', 'Bob', 'Ann', 'Carl']

for i in range(len(lst)+1):
    lst[i]


# Traceback (most recent call last):
#   File "C:\Users\xcent\Desktop\code.py", line 5, in <module>
#     lst[i]
# IndexError: list index out of range

El mensaje de error te indica que el error aparece en la línea 5. Así que vamos a insertar una declaración de impresión antes de esa línea:

lst = ['Alice', 'Bob', 'Ann', 'Carl']

for i in range(len(lst)+1):
    print(i)
    lst[i]

El resultado de este fragmento de código sigue siendo un error. Pero aún hay más:

0
1
2
3
4
Traceback (most recent call last):
  File "C:\Users\xcent\Desktop\code.py", line 6, in <module>
    lst[i]
IndexError: list index out of range

Ahora puedes ver todos los índices utilizados para recuperar un elemento. El último es el índice i=4 que apunta al quinto elemento de la lista (recuerda: ¡Python empieza a indexar en el índice 0!). Pero la lista tiene solo cuatro elementos, por lo que debes reducir la cantidad de índices sobre los que estás iterando. El código correcto es, por tanto:

# CORRECT CODE
lst = ['Alice', 'Bob', 'Ann', 'Carl']

for i in range(len(lst)):
    lst[i]

Ten en cuenta que este es un ejemplo minimalista y que no tiene mucho sentido. Pero la estrategia general de depuración se mantiene incluso para los proyectos de código avanzado:

  • Averigua el índice defectuoso justo antes de que se produzca el error.
  • Elimina el origen del índice defectuoso.

Error de índice al modificar una lista mientras se itera sobre ella

El IndexError también ocurre con frecuencia si se itera sobre una lista pero se eliminan elementos a medida que itera sobre ella:

l=[1,2,3,0,0,1]
for i in range(0, len(l)):
      if l[i]==0:
          l.pop(i)

Este fragmento de código es de una pregunta de StackOverflow. La causa es simplemente que el método list.pop() elimina el elemento con valor 0. Todos los elementos subsiguientes tienen ahora un índice menor. Pero iteras sobre todos los índices hasta len(l)-1 = 6-1 = 5 y el índice 5 no existe en la lista tras eliminar elementos en una iteración anterior.

Puedes solucionarlo de forma sencilla con una breve declaración de comprensión de lista que consigue lo mismo:

l = [x for x in l if x]

En la lista solo se incluyen elementos distintos de cero.

IndexError: Índice de cadena fuera de rango

El error también puede ocurrir al acceder a cadenas:

s = 'Python'
print(s[6])

Para solucionar el error en cadenas, asegúrate de que el índice se encuentra entre el rango 0 … len(s)-1 (incluido):

s = 'Python'
print(s[5])
# n

IndexError: Índice de tupla fuera de rango

De hecho, el IndexError puede producirse en todas las colecciones ordenadas en las que se pueda utilizar la indexación para recuperar determinados elementos. Así, también ocurre al acceder a índices de tupla que no existen:

s = ('Alice', 'Bob')
print(s[2])

De nuevo, empieza a contar desde el índice 0 para eliminar esto:

s = ('Alice', 'Bob')
print(s[1])
# Bob

Nota: El índice del último elemento de cualquier secuencia es len(secuencia) - 1.