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]
fonte
2012-04-02 02:20:54
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. –
@Karl: ho appena aggiunto una lista di comprensione per fare esattamente questo. –
@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