Seite 1 von 1

Hilfe bei Liste-Programm

Verfasst: Freitag 18. Dezember 2020, 15:51
von LN1289
Hallo, ich möchte Duplikate aus einer Liste von Nummern entfernen. Dazu habe ich folgenden Code geschrieben:

numbers = [2, 5, 5, 5, 6, 0, 1, 2, 2, 2, 3, 4, 4, 5, 5, 6, 6]

for i in numbers:
if numbers.count(i) > 1:
numbers.remove(i)

print(numbers)


Als Ergebnis bekomme ich:
[5, 0, 1, 2, 3, 4, 5, 5, 6]

Es werden also einige Zahlen die doppelt vorkommen nicht entfernt. Warum?

Vielen Dank.
Viele Grüße,
LN1289

Re: Hilfe bei Liste-Programm

Verfasst: Freitag 18. Dezember 2020, 20:25
von narpfel
Moin,

du darfst im Allgemeinen eine Liste, über die du gerade iterierst, nicht verändern. Erstelle stattdessen eine neue Liste, in die du die gewünschten Werte einfügst. Eventuell hilft auch `collections.Counter`.

Hintergrund: Die `for`-Schleife benutzt einen Iterator, um über die Liste zu iterieren. Dieser Iterator merkt sich die Position in der Liste des nächsten Elements, das er liefern soll. Wenn du jetzt die Liste veränderst, hat der Iterator keine Möglichkeit, das mitzubekommen und dementsprechend passt die Position dann nicht mehr. Ergebnis: Entweder überspringst du Elemente, oder du bekommst Elemente doppelt.

Re: Hilfe bei Liste-Programm

Verfasst: Freitag 18. Dezember 2020, 20:28
von Sirius3
Man darf keine Elemente aus einer Liste löschen, über die gerade iteriert wird.
Man ändert auch keine Listen, sondern erzeugt am besten eine neue.

Re: Hilfe bei Liste-Programm

Verfasst: Freitag 18. Dezember 2020, 20:54
von hyle
Ich traue mir das fast nicht zu schreiben, aber wenn ich das mal brauche, dann erstelle ich der Einfacht wegen mit set() eine neue Liste. :oops:

Code: Alles auswählen

>>> numbers = [2, 5, 5, 5, 6, 0, 1, 2, 2, 2, 3, 4, 4, 5, 5, 6, 6]
>>> new_list = list(set(numbers))
>>> print(new_list)
[0, 1, 2, 3, 4, 5, 6]
>>> 
Dann stimmt die Reihenfolge zwar nicht mehr, aber das stört mich nicht.

Re: Hilfe bei Liste-Programm

Verfasst: Dienstag 22. Dezember 2020, 22:33
von LN1289
Ok, alles klar, ich erstelle eine neue Liste.
Danke vielmals !