2012-04-02 13 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 

Perché questo aggiunge e rimuove solo l'elemento "2"?Spostamento di elementi tra elenchi Python

Inoltre, quando commento "listA.remove (i)", funziona come previsto.

risposta

12

Non si dovrebbe modificare l'elenco su cui si sta iterando, questo comporta un comportamento sorprendente (perché l'iteratore utilizza gli indici internamente e quelli vengono modificati rimuovendo gli elementi). Che cosa si può fare è quello di iterare su una copia di listA:

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

Esempio:

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

Tuttavia, è spesso molto più pulito di andare il modo funzionale e non modificare l'elenco originale a tutti , invece, basta creare una nuova lista con i valori necessari. È possibile utilizzare list comprehension per farlo con eleganza:

>>> 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

Che cosa si dovrebbe fare è costruire le liste di output che si desidera, e quindi forse buttare via l'originale (o assegnare su di esso), se non è più necessario. –

+0

@Karl: ho appena aggiunto una lista di comprensione per fare esattamente questo. –

+0

@NiklasB. La comprensione delle liste era esattamente ciò che ho finito per fare, ma non ero sicuro del motivo per cui inizialmente avevo il problema. – devinpleuler

Problemi correlati