Liste komplett iterieren, während elemente entfernt werden
Verfasst: Montag 1. August 2016, 12:41
Hallo zusammen,
ich habe ein Problem mit der vollständigen Iterierung einer Liste:
Angenommen, ich habe folgende Liste "liste":
Aus dieser Liste möchte ich nun einzelne Elemente herauslösen, nachdem diese verarbeitet wurden, das heißt: beispielsweise, nachem eine Regex-Prüfung darauf stattgefunden hat. Also dachte ich, gehe ich wie folgt vor:
Hierbei behalte ich jedoch folgendes übrig:
Ich glaube auch zu wissen warum das so ist (korrigiert mich, wenn ich falsch liege):
Python prüft das erste Element in der Liste ("aaa"); dieses matched nicht, also: Next.
Das zweite Element (index 1) matched; also wird es mit der Listenmethode ".remove" entfernt. Dabei rücken die nachfolgenden Elemente eine Position "nach links"; das 2. "bbb" an index 2 rückt auf index 1, das "ccc" auf index 3 rückt auf index 2. Python weiß: Er hat gerade index 1 verarbeitet, also ist als nächstes index 2 dran. Auf index 2 liegt aber ja nicht mehr das eigentlich "nächste" Element, sondern "ccc". Hierdurch wird das 2. "bbb" nie bearbeitet.
Frage 1: Alles richtig soweit, oder bin ich da auf dem Holzweg?
Frage 2: Wie mache ich dieses denn "Korrekt", also: So das alle Elemente einmal verarbeitet werden? Eine Methode wäre ja alles was NICHT matched in eine neue Liste zu kopieren und die alte anschließend zu verwerfen; das fühlt sich aber irgendwie unsauber an und ich vermute, das das unerwünschte Seiteneffekte haben könnte. Das wird doch wohl auch irgendwie in der Liste gehen, oder?
Danke schonmal für Eure Hilfe!
LG
ich habe ein Problem mit der vollständigen Iterierung einer Liste:
Angenommen, ich habe folgende Liste "liste":
Code: Alles auswählen
liste = ['aaa', 'bbb', 'bbb', 'ccc']
Code: Alles auswählen
import re
pat = re.compile('^bbb$')
for elem in liste:
if re.match(pat, elem):
liste.remove(elem)
Code: Alles auswählen
['aaa', 'bbb', 'ccc']
Python prüft das erste Element in der Liste ("aaa"); dieses matched nicht, also: Next.
Das zweite Element (index 1) matched; also wird es mit der Listenmethode ".remove" entfernt. Dabei rücken die nachfolgenden Elemente eine Position "nach links"; das 2. "bbb" an index 2 rückt auf index 1, das "ccc" auf index 3 rückt auf index 2. Python weiß: Er hat gerade index 1 verarbeitet, also ist als nächstes index 2 dran. Auf index 2 liegt aber ja nicht mehr das eigentlich "nächste" Element, sondern "ccc". Hierdurch wird das 2. "bbb" nie bearbeitet.
Frage 1: Alles richtig soweit, oder bin ich da auf dem Holzweg?
Frage 2: Wie mache ich dieses denn "Korrekt", also: So das alle Elemente einmal verarbeitet werden? Eine Methode wäre ja alles was NICHT matched in eine neue Liste zu kopieren und die alte anschließend zu verwerfen; das fühlt sich aber irgendwie unsauber an und ich vermute, das das unerwünschte Seiteneffekte haben könnte. Das wird doch wohl auch irgendwie in der Liste gehen, oder?
Danke schonmal für Eure Hilfe!
LG