10
votes

Comment modifier correctement l'itérateur d'une boucle dans Python de la boucle

Ce que je dois fondamentalement, c'est de vérifier chaque élément d'une liste et si certains critères conviennent, je veux le supprimer de la liste.

Donc, par exemple, disons que P>

for s in list:
    if s=='b' or s=='c':
        list.remove(s)


0 commentaires

4 Réponses :


12
votes

Le moyen plus facile est d'utiliser une copie de la liste - elle peut être effectuée avec une tranche qui s'étend "du début" à la "fin" de la liste, comme ceci: xxx < P> Vous avez considéré cela, et c'est assez simple pour être dans votre code, à moins que cette liste soit vraiment grosse, et dans une partie critique du code (comme, dans la boucle principale d'un jeu d'action). Dans ce cas, j'utilise parfois les idiom suivants: xxx

Bien sûr, vous pouvez recourir à une boucle tandis que: xxx < / p>


2 commentaires

Jsbueno merci beaucoup. Je me sens un peu honte de ne pas penser ça. Merci encore!


En fait, j'ai voulu une boucle au sein d'une boucle et votre dernier exemple était parfait. Merci encore.



1
votes

Si vous allez bien avec la création d'une copie de la liste, vous pouvez le faire comme ceci ( Compréhension de la liste ):

[s for s in list if s != 'b' and s != 'c']


0 commentaires

9
votes

Il est préférable de ne pas réinventer des choses déjà disponibles. Utilisez Filtre Fonctions et Lambda dans ces cas. Son plus pythonique et a l'air plus propre.

[x for x in ['a','b','c','d','e'] if x not in ['b','c']]


2 commentaires

En réalité, la compréhension de la liste dans votre deuxième exemple est "plus pythonique" que la combinaison filtre et lambda.


Merci mais j'avais besoin de mettre une telle boucle dans une autre et cette façon, les choses peuvent devenir vraiment désordonnées.



3
votes

C'est exactement ce que ItERTools.Ifilter est conçu pour.

[x for x in ifilter(lambda x: x not in ['b', 'c'], ['a', 'b', 'c', 'd', 'e'])]


0 commentaires