2012-04-02 117 views
5
listA = [1,2,3] 
listB = [] 

print listA 
print listB 

for i in listA: 
     if i >= 2: 
       listB.append(i) 
       listA.remove(i) 
print listA 
print listB 

¿Por qué esto solo agrega y elimina el elemento "2"?Mover elementos de Python entre listas

Además, cuando comento "listA.remove (i)", funciona como se esperaba.

Respuesta

12

No debe modificar la lista sobre la que está iterando, esto produce un comportamiento sorprendente (porque el iterador usa índices internamente y los modifica eliminando elementos). Lo que puede hacer es iterar sobre una copia de listA:

for i in listA[:]: 
    if i >= 2: 
    listB.append(i) 
    listA.remove(i) 

Ejemplo:

>>> listA = [1,2,3] 
>>> listB = [] 
>>> for i in listA[:]: 
... if i >= 2: 
...  listB.append(i) 
...  listA.remove(i) 
... 
>>> listA 
[1] 
>>> listB 
[2, 3] 

Sin embargo, a menudo es mucho más limpio a seguir el camino funcional y no modificar la lista original en absoluto , en lugar de simplemente crear una nueva lista con los valores que necesita. Puede utilizar las listas por comprensión de hacerlo con elegancia:

>>> lst = [1,2,3] 
>>> small = [a for a in lst if a < 2] 
>>> big = [a for a in lst if a >= 2] 
>>> small 
[1] 
>>> big 
[2, 3] 
+0

Lo que debe hacer es construir las listas de salida que se desea, y entonces tal vez de tirar el original (o asignar sobre él) si ya no lo necesita. –

+0

@Karl: Acabo de agregar una lista de comprensión para hacer exactamente eso. –

+0

@NiklasB. La comprensión de la lista fue exactamente lo que terminé haciendo, pero no estaba seguro de por qué estaba recibiendo el problema inicialmente. – devinpleuler

Cuestiones relacionadas