Rimuovere gli elementi mentre attraversate una lista in Python [duplicare]
-
20-09-2019 - |
Domanda
Questa domanda ha già una risposta qui:
In Java che posso fare utilizzando un Iterator
e quindi utilizzando il .remove()
metodo iteratore per rimuovere l'ultimo elemento restituito dal iteratore, in questo modo:
import java.util.*;
public class ConcurrentMod {
public static void main(String[] args) {
List<String> colors = new ArrayList<String>(Arrays.asList("red", "green", "blue", "purple"));
for (Iterator<String> it = colors.iterator(); it.hasNext(); ) {
String color = it.next();
System.out.println(color);
if (color.equals("green"))
it.remove();
}
System.out.println("At the end, colors = " + colors);
}
}
/* Outputs:
red
green
blue
purple
At the end, colors = [red, blue, purple]
*/
Come potrei fare questo in Python? Non riesco a modificare l'elenco, mentre io scorrere su di esso in un ciclo perché provoca roba da saltare (vedi qui ). E non sembra essere un equivalente dell'interfaccia Iterator
di Java.
Soluzione
iterazioni su una copia della lista:
for c in colors[:]:
if c == 'green':
colors.remove(c)
Altri suggerimenti
Best approccio in Python è quello di fare una nuova lista, idealmente in una listcomp, impostandola come [:]
del vecchio, per esempio:.
colors[:] = [c for c in colors if c != 'green']
NON colors =
come alcune risposte possono suggerire - che rebinds solo il nome e alla fine lasciare alcuni riferimenti al vecchio penzoloni "corpo"; colors[:] =
è molto meglio su tutti i fronti, -).
È possibile utilizzare la funzione di filtro:
>>> colors=['red', 'green', 'blue', 'purple']
>>> filter(lambda color: color != 'green', colors)
['red', 'blue', 'purple']
>>>
oppure si può anche fare come questo
>>> colors = ['red', 'green', 'blue', 'purple']
>>> if colors.__contains__('green'):
... colors.remove('green')