Kann man eine Liste in einem Durchlauf verändern?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Angenommen ich habe eine einfache Liste:

Code: Alles auswählen

a = [1,2,3,4,5]
Nun möchte ich aus der Liste in einem Durchlauf bestimmte Element entfernen, z.B.:

Code: Alles auswählen

for i in a:
    if i == 3:
        a.remove(i)
Ist das erlaubt oder ziehe ich damit dem Listenindex (in der for-Schleife) den Teppich unter den Füssen weg?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Genial!

Ich iteriere über die Kopie und verändere das Original. Habe ich das richtig verstanden?
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Aber warum funktioniert das hier denn trotzdem?

Code: Alles auswählen

>>> a = [1,2,3,4,5]
>>> for i in a:
...     if i==3:
...             a.remove(i)
... 
>>> a
[1, 2, 4, 5]
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

rhersel hat geschrieben:Aber warum funktioniert das hier denn trotzdem?
[...]
Tut es nicht. Probier mal

Code: Alles auswählen

a = [1,2,3,4,5]
for i in a:
    if i in (3,4):
        a.remove(i)
print a
Du bringst, wie du vermutet hast, tatsächlich den internen Index durcheinander.
Gruß
Nobert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

list.remove() hat eine Performance von O(n) und sollte deswegen vermieden werden wenn man mehrere Elemente entfernen will. Da sollte man eine LC oder filter() zu verwenden und eine neue Liste erzeugen.
Antworten