(Python) Índice de lista fuera de rango – iteración

for i in range(len(lst)): if lst[i][0]==1 or lst[i][1]==1: lst.remove(lst[i]) return lst 

Esto le da a “IndexError: índice de lista fuera de rango” ¿Por qué sucede esto?

Estás modificando la lista sobre la que estás iterando. Si lo hace, el tamaño de la lista se reduce, por lo que eventualmente lst[i] apuntará más allá de los límites de la lista.

 >>> lst = [1,2,3] >>> lst[2] 3 >>> lst.remove(1) >>> lst[1] 3 >>> lst[2] Traceback (most recent call last): File "", line 1, in  IndexError: list index out of range 

Es más seguro construir una nueva lista:

 return [item for item in lst if item[0]!=1 and item[1]!=1] 

No debes remove elementos de la list medida que recorres la list ; que cambia los índices de todos los elementos posteriores, de ahí el IndexError . Podrías probar una simple lista de comprensión:

 lst = [item for item in lst if (item[0] != 1 and item[1] != 1)] 

En general, significa que está proporcionando un índice para el que no existe un elemento de lista.

Por ejemplo, si su lista era [12, 32, 50, 71] y solicitó el elemento en el índice 10, estaría fuera de límites y recibiría un error, ya que solo existen los elementos del 0 al 3.

El problema es que elimina elementos de la lista, lo que reduce su tamaño. Lo que debe hacer es crear una matriz con los índices que desea eliminar y eliminarlos al revés.

Otra forma sería crear una lista temporal que agregaría los elementos que no desea eliminar y luego sobrescribir su lista inicial con la lista que contiene todos los elementos que desea mantener.

Por el proceso de deducción, he llegado a la conclusión de que su primera luce algo así:

lst = [… [val1, val2], [val1, val2], [val1, val2] …]

Creo que lo que sucedió aquí es que confundiste tu ‘for i in range’, con un ‘for i in’ (también lo he hecho muchas veces).

La línea donde está ocurriendo su error es:
lst.remove (lst [i])

Puedes corregir esto simplemente cambiando tu código de esta manera:

 for i in lst: if i[0] ==1 or i[1] ==1: lst.remove(lst[i]) return lst 

La forma en que se estructuró su código antes de la lista [i] no tenía ningún sentido, su i era un número mayor que el número de elementos de dos valores en lst.

= D