Comme la boucle ci-dessous ne fait que modifier des éléments déjà vus, elle serait considérée comme acceptable :
a = ['a',' b', 'c ', ' d ']
for i, s in enumerate(a):
a[i] = s.strip()
print(a) # -> ['a', 'b', 'c', 'd']
Ce qui est différent de :
a[:] = [s.strip() for s in a]
en ce sens qu'elle ne nécessite pas la création d'une liste temporaire et l'affectation de celle-ci en remplacement de l'originale, bien qu'elle exige davantage d'opérations d'indexation.
Attention : Bien que vous puissiez modifier De cette façon, vous ne pouvez pas modifier le nombre d'éléments dans la liste de contrôle. list
sans risquer de rencontrer des problèmes.
Voici un exemple de ce que je veux dire : la suppression d'une entrée perturbe l'indexation à partir de ce moment-là :
b = ['a', ' b', 'c ', ' d ']
for i, s in enumerate(b):
if s.strip() != b[i]: # leading or trailing whitespace?
del b[i]
print(b) # -> ['a', 'c '] # WRONG!
(Le résultat est erroné car il n'a pas supprimé tous les éléments qu'il aurait dû supprimer).
Mise à jour
Cette réponse étant assez répandue, voici comment supprimer efficacement des entrées "sur place" (même si ce n'est pas exactement la question) :
b = ['a',' b', 'c ', ' d ']
b[:] = [entry for entry in b if entry.strip() == entry]
print(b) # -> ['a'] # CORRECT
Voir Comment supprimer des éléments d'une liste lors de l'itération ? .