226 votes

Comment modifier les entrées d'une liste pendant une boucle for ?

Je sais maintenant qu'il n'est pas sûr de modifier la liste au cours d'un bouclage itératif. Cependant, supposons que j'aie une liste de chaînes de caractères et que je veuille dépouiller les chaînes elles-mêmes. Le remplacement des valeurs mutables est-il considéré comme une modification ?


Voir <a href="https://stackoverflow.com/questions/15363138">Portée d'une variable python dans une boucle for </a>pour un problème connexe : l'affectation au <em>variable d'itération </em>ne modifie pas la séquence sous-jacente et n'a pas non plus d'impact sur l'itération future.

4voto

Skurmedel Points 9227

Non, vous ne modifieriez pas le "contenu" de la liste, si vous pouviez modifier les chaînes de cette façon. Mais en Python, elles ne sont pas mutables. Toute opération sur une chaîne renvoie une nouvelle chaîne.

Si vous avez une liste d'objets que vous savez être mutables, vous pouvez le faire tant que vous ne changez pas le contenu réel de la liste.

Vous devrez donc établir une sorte de carte. Si vous utilisez une expression génératrice, elle [l'opération] sera effectuée au fur et à mesure de l'itération et vous économiserez de la mémoire.

4voto

Nenoj Points 56

Vous pouvez faire quelque chose comme ça :

a = [1,2,3,4,5]
b = [i**2 for i in a]

C'est ce qu'on appelle une compréhension de liste, pour faciliter le bouclage à l'intérieur d'une liste.

1voto

Jorge Points 11

Votre question n'indique pas clairement quel est le critère de sélection des chaînes à supprimer, mais si vous avez ou pouvez établir une liste des chaînes que vous souhaitez supprimer, vous pouvez procéder comme suit :

my_strings = ['a','b','c','d','e']
undesirable_strings = ['b','d']
for undesirable_string in undesirable_strings:
    for i in range(my_strings.count(undesirable_string)):
        my_strings.remove(undesirable_string)

ce qui change mes_chaînes en ['a', 'c', 'e']

1voto

siva balan Points 199

En bref, pour effectuer des modifications sur la liste tout en itérant la même liste.

list[:] = ["Modify the list" for each_element in list "Condition Check"]

exemple :

list[:] = [list.remove(each_element) for each_element in list if each_element in ["data1", "data2"]]

-1voto

Programmer Points 4154

Je viens de découvrir quelque chose : lorsque l'on fait une boucle sur une liste de types mutables (comme les dictionnaires), on peut utiliser une boucle for normale comme ceci :

l = [{"n": 1}, {"n": 2}]
for d in l:
    d["n"] += 1
print(l)
# prints [{"n": 2}, {"n": 1}]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X