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.

È stato utile?

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')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top