J'ai perdu un peu de temps dans ce Python pour la déclaration:Comment supprimer des éléments de la liste en vélo la liste elle-même sans dupliquer
class MyListContainer:
def __init__(self):
self.list = []
def purge(self):
for object in self.list:
if (object.my_cond()):
self.list.remove(object)
return self.list
container = MyListContainer()
# now suppose both obj.my_cond() return True
obj1 = MyCustomObject(par)
obj2 = MyCustomObject(other_par)
container.list = [obj1, obj2]
# returning not an empty list but [obj2]
container.purge()
Il ne fonctionne pas comme je m'y attendais parce que quand le cycle " purge "supprimer le premier objet dans la liste le second est déplacé au début de la liste et le cycle est terminé.
Je résolus de dupliquer self.list avant pour le cycle:
...
local_list = self.list[:]
for object in local_list:
...
Je suppose que le travail pour arrêter déclaration parce que je change la longueur de la liste initiale. Quelqu'un peut-il clarifier ce point?
Y a-t-il un moyen plus "élégant" de résoudre ce problème? Si j'ai plus de quelques éléments dans la liste, la dupliquer à chaque fois ne semble pas être une bonne idée.
Peut-être que la fonction filter() est la bonne, mais je souhaite avoir une autre approche, le cas échéant.
Je suis un débutant.
Pour résumer vos réponses utiles:
- Ne jamais modifier une liste que vous Looping
- Dupliquer la liste ou la liste d'utilisation compréhensions
- Duplication une liste ne pouvait pas perdre votre mémoire ou dans ce cas qui s'en soucie
Je me demande pourquoi la modification * en place * aurait de l'importance. – SilentGhost
Je préfère la première approche parce que je peux utiliser une clause try à l'intérieur de la boucle for pour être sûr de terminer la boucle. mycond() pourrait générer une erreur. – yuri
La modification en place peut être importante dans les langages de bas niveau, pour des raisons de performance et de mémoire. Mais ce n'est généralement pas pertinent en Python - le surcoût de Python lui-même l'écrase. –