Seite 1 von 1

doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:22
von Michi_J
Hallo, wieder eine Frage:

wie kann ich in einer Liste Einträge, die doppelt vorhanden sind löschen, sodass jeder Eintrag nur noch 1x vorkommt?

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:25
von jbs

Code: Alles auswählen

list(set(original_list))

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:28
von jbs
Wobei, lieber so:

Code: Alles auswählen

sorted(set(original_list), key=original_list.index)

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:39
von Michi_J

Code: Alles auswählen


neue_liste3=(set(neue_liste2), key=neue_liste2.index)

print neue_liste3

gibt mir die Fehlermeldung: invalid syntax, list objects are unhashable

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:42
von Michi_J

Code: Alles auswählen

neue_liste3=sorted(set(neue_liste2), key=neue_liste2.index)

print neue_liste3
so sieht mein Code natürlich aus, hatte vorhin noch das sorted vergessen

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:47
von EyDu
Der Fehler hat einen ganz einfachen Grund: Du kannst Listen nicht in eine Menge packen, da diese veränderbar sind.

Statt der Menge könntest du einfach eine weitere Liste verwenden, in welche du alle bereits verwendeten Elemente eingefügt hast.

Code: Alles auswählen

>>> l = [[1], [2], [4], [1], [5], [2], [1]]                                
>>> x = []
>>> n = []
>>> for e in l:
...     if e not in x:
...         n.append(e)
...         x.append(e)
... 
>>> n
[[1], [2], [4], [5]]

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:52
von Michi_J
und ich sollte eventuell dazu sagen, dass meine Liste aus Tupeln besteht mit mehreren Einträgen, im speziellen Fall X-, Y-, Z-Koordinate:

Liste = [ [XYZ1], [XYZ2], [XYZ3], [XYZ1],... ]

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:55
von ms4py
Michi_J hat geschrieben:und ich sollte eventuell dazu sagen, dass meine Liste aus Tupeln besteht mit mehreren Einträgen, im speziellen Fall X-, Y-, Z-Koordinate:

Liste = [ [XYZ1], [XYZ2], [XYZ3], [XYZ1],... ]
In diesem Fall solltest du als innere Datenstruktur lieber Tupel verwenden (da die Anzahl mit 3 ja fix ist). Dann funktioniert auch oben genanntes Beispiel.

Code: Alles auswählen

In [6]: l = [(1,2), (3,4), (5,6), (1,2)]

In [7]: sorted(set(l), key=l.index)
Out[7]: [(1, 2), (3, 4), (5, 6)]

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 19:57
von Michi_J
ich habs jetzt so probiert, wie EyDu gesagt hat, hat auch geklappt...
Wie würde es denn mit dem sorted-Befehl funktionieren?

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 20:00
von ms4py
Michi_J hat geschrieben:ich habs jetzt so probiert, wie EyDu gesagt hat, hat auch geklappt...
Wie würde es denn mit dem sorted-Befehl funktionieren?
siehe oben

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 20:02
von EyDu
Wenn du unveränderliche Objekte hast, dann hätte ich auch noch eine "Lösung":

Code: Alles auswählen

>>> l = [1,2,4,6,2,8,3,5,1,5,1]
>>> x = {}
>>> [x.setdefault(v, v) for v in l if v not in x]

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 20:02
von Michi_J
@ms4py: habs erst grad gesehen, klappt auch. Herzlichen Dank!

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 20:11
von BlackJack
@jbs: Die `sorted()`/`index()`-Lösung braucht man nur, wenn die Reihenfolge erhalten bleiben muss, und selbst dann ist sie IMHO sehr unschön, da sie quadratische Laufzeit hat. Das geht auch besser.

Re: doppelte Einträge in einer Liste löschen

Verfasst: Donnerstag 19. August 2010, 20:46
von jbs
BlackJack hat geschrieben:@jbs: Die `sorted()`/`index()`-Lösung braucht man nur, wenn die Reihenfolge erhalten bleiben muss, und selbst dann ist sie IMHO sehr unschön, da sie quadratische Laufzeit hat. Das geht auch besser.
Alles klar. Eydus Lösung sieht da schöner aus.