Maintenant, je sais qu'il n'est pas sûr de modifier la liste pendant une boucle itérative. Cependant, supposons que je dispose d'une liste de chaînes et que je veuille supprimer les chaînes elles-mêmes. Le remplacement des valeurs mutables compte-t-il comme une modification?
178
Réponses:
C'est considéré comme une mauvaise forme. Utilisez plutôt une compréhension de liste, avec une attribution de tranche si vous devez conserver les références existantes à la liste.
la source
print b
instruction est exécutée, vous pouvez dire si elle aa
été modifiée sur place plutôt que remplacée. Une autre possibilité aurait étéprint b is a
de voir si les deux font toujours référence au même objet.Étant donné que la boucle ci-dessous ne modifie que les éléments déjà vus, elle serait considérée comme acceptable:
Ce qui est différent de:
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
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 point:
(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):
la source
for i in a
? Ceci est très contre-intuitif, apparemment différent des autres langages et a entraîné des erreurs dans mon code que j'ai dû déboguer pendant une longue période. Le didacticiel Python ne le mentionne même pas. Mais il doit y avoir une raison à cela?a[i]
ets
) pour le même objet dans la même ligne alors que vous n'êtes pas obligé? Je préfère de loin le fairea[i] = a[i].strip()
.a[i] = s.strip()
qu'une seule opération d'indexation.enumerate(b)
effectue une opération d'indexation à chaque itération et vous en faites une autre aveca[i] =
. AFAIK il est impossible d'implémenter cette boucle en Python avec seulement 1 opération d'indexation par itération de boucle :(Une variante de boucle de plus, me semble plus propre qu'une avec enumerate ():
la source
range(len(list))
en Python une odeur de code.enumerate
s'agit d'un générateur, il ne crée pas une liste de tuples, il les crée un par un au fur et à mesure qu'il parcourt la liste. La seule façon de savoir ce qui est le plus lent serait de le fairetimeit
.timeit
enumerate
est plus lentLa modification de chaque élément lors de l'itération d'une liste est très bien, tant que vous ne modifiez pas ajouter / supprimer des éléments à la liste.
Vous pouvez utiliser la compréhension de liste:
ou faites simplement la
C-style
boucle for:la source
Non, vous ne modifieriez pas le "contenu" de la liste, si vous pouviez muter les chaînes de cette façon. Mais en Python, ils ne sont pas modifiables. Toute opération de chaîne renvoie une nouvelle chaîne.
Si vous aviez une liste d'objets que vous saviez modifiables, vous pouvez le faire tant que vous ne changez pas le contenu réel de la liste.
Ainsi, vous aurez besoin de faire une carte quelconque. Si vous utilisez une expression de générateur, [l'opération] sera effectuée au fur et à mesure que vous itérez et vous économiserez de la mémoire.
la source
Vous pouvez faire quelque chose comme ceci:
Cela s'appelle une compréhension de liste, pour vous permettre de faire une boucle dans une liste.
la source
La réponse donnée par Jemshit Iskenderov et Ignacio Vazquez-Abrams est vraiment bonne. Cela peut être illustré plus en détail avec cet exemple: imaginez que
a) Une liste avec deux vecteurs vous est donnée;
b) vous souhaitez parcourir la liste et inverser l'ordre de chacun des tableaux
Disons que vous avez
Tu auras
D'un autre côté, si vous faites
Le résultat est
la source
Il n'est pas clair d'après votre question quels sont les critères pour décider des chaînes à supprimer, mais si vous avez ou pouvez faire une liste des chaînes que vous souhaitez supprimer, vous pouvez effectuer les opérations suivantes:
qui change mes_chaînes en ['a', 'c', 'e']
la source
Bref, faire des modifications sur la liste en itérant la même liste.
exemple:
la source