Étant donné que la boucle ci-dessous ne modifie que les é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 qu 'il ne nécessite pas la création d'une liste temporaire et une affectation de celle-ci pour remplacer l'original, bien qu'il nécessite plus d'opérations d'indexation.
Attention: bien que vous puissiez modifier les entrées de cette manière, vous ne pouvez pas modifier le nombre d'éléments dans le listsans 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 point:
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 faux car il n'a pas supprimé tous les éléments qu'il aurait dû.)
Mettre à jour
Comme il s'agit d'une réponse assez populaire, voici comment supprimer efficacement les 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