Eliminar elementos de una lista en Python

Estoy usando Python 3.4 y solo estoy aprendiendo lo básico, así que por favor ten paciencia conmigo.

listA = [1,2] for a in listA: listA.remove(a) print(listA) 

Lo que se supone es que obtengo una lista vacía, pero lo que obtengo es una lista con el valor ‘2’. He depurado el código con un gran no. de valores en la lista y cuando la lista tiene un solo elemento, la salida de bucle for. ¿Por qué no se elimina el último elemento de la lista …?

No debes cambiar una lista mientras estés iterando sobre ella. Los índices de la lista cambian a medida que se eliminan los elementos, de modo que algunos elementos nunca se evalúan. Utilice una lista de comprensión en su lugar, lo que crea una nueva lista:

 [a for a in list if ...] 

En otras palabras, intente algo como esto:

 >>> A = [1, 2, 3, 4] >>> A = [a for a in A if a < 4] # creates new list and evaluates each element of old >>> A [1, 2, 3] 

Cuando se utiliza un bucle for, se utiliza un contador interno. Si desplaza los elementos restantes hacia la izquierda mientras recorre la list , no se evaluará el elemento situado más a la izquierda de la list restante. Vea la nota para la statement .

Esto sucede porque la longitud de for se evalúa solo al principio y usted modifica la lista mientras realiza un bucle en ella:

 >>> l = [1,2,3] >>> l [1, 2, 3] >>> for a in l: print(a) print(l) l.remove(a) print(a) print(l) print("---") 1 [1, 2, 3] 1 [2, 3] --- 3 [2, 3] 3 [2] --- >>> 

¿Ver? El valor de la variable implícita utilizada para indexar la lista y el bucle sobre ella aumenta y omite el segundo elemento.

Si quieres vaciar una lista, haz una clara:

 >>> l.clear() >>> l [] 

O use una forma diferente de realizar un bucle en la lista, si necesita modificarla mientras realiza un bucle sobre ella.

Como lo mencionó @Justin en los comentarios, no altere la lista mientras esté iterando en ella. A medida que continúa eliminando los elementos de la lista, el tamaño de la lista se reduce, lo que cambiará los índices del elemento.

Si necesita eliminar elementos de la lista uno por uno, repita una copia de la lista dejando intacta la lista original, mientras modifica la lista duplicada en el proceso.

 >>> listA = [1,2,3,4] >>> listB = [1,2,3,4] >>> for each in listA: ... print each ... listB.remove(each) 1 2 3 4 >>> listB []