Question

    

Cette question a déjà une réponse ici:

         

En Java je peux faire en utilisant un Iterator et puis en utilisant le .remove() procédé de l'itérateur pour supprimer le dernier élément retourné par l'itérateur, comme suit:

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]
*/

Comment puis-je faire cela en Python? Je ne peux pas modifier la liste alors que j'itérer sur elle dans une boucle, car il provoque des choses à sauter (voir ici ). Et il ne semble pas être un équivalent de l'interface Iterator de Java.

Était-ce utile?

La solution

itérer sur Copier de la liste:

for c in colors[:]:
    if c == 'green':
        colors.remove(c)

Autres conseils

Meilleure approche en Python est de faire une nouvelle liste, idéalement dans un listcomp, le définir comme le [:] de l'ancien, par exemple:.

colors[:] = [c for c in colors if c != 'green']

PAS colors = que certaines réponses peuvent suggérer - que seul le nom et lie de nouveau finira par laisser quelques références à l'ancien ballants « corps »; colors[:] = est beaucoup mieux sur tous les points; -).

Vous pouvez utiliser la fonction de filtre:

>>> colors=['red', 'green', 'blue', 'purple']
>>> filter(lambda color: color != 'green', colors)
['red', 'blue', 'purple']
>>>

ou vous pouvez aussi le faire comme ceci

>>> colors = ['red', 'green', 'blue', 'purple']
>>> if colors.__contains__('green'):
...     colors.remove('green')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top