Doppelte Elemente aus Liste löschen

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
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

hallo,

Code: Alles auswählen

>>> k=[1,2,2,3,2,2,3,6,5,4,5,1]
>>> print list(set(k))
[1, 2, 3, 4, 5, 6]
>>> j=[range(5), range(6), range(5), range(5), range(3), range(6)]
>>> print list(set(j))
Traceback (most recent call last):
  File "<pyshell#67>", line 1, in ?
    print list(set(j))
TypeError: list objects are unhashable
Wie kann ich doppelte Listen aus einer Liste löschen?

Hier hab ich einen (nicht sehr eleganten) Ansatz:

Code: Alles auswählen

>>> k=j[:]
for elemt in k:
	i=0
	while k.count(k[i]) != 1:
		del k[i]
		i+=1

>>> k
[[0, 1, 2, 3, 4], [0, 1, 2], [0, 1, 2, 3, 4, 5]]
Allerdings scheint das nicht bei allen listen zu gehen:

Code: Alles auswählen

IndexError: list index out of range
Es gibt doch bestimmt eine elegante Methode..

Schon mal Danke im Voraus
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

>>> j=[range(5), range(6), range(5), range(5), range(3), range(6)]
>>> from itertools import groupby
>>> [g for g, k in groupby(sorted(j))]
[[0, 1, 2], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5]]
lunar

Vielleicht solltest du deine Datenstruktur überdenken, denn sowas lässt sich nicht effizient implementieren.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Du kannst set nicht mit Listen benutzen weil die veränderlich sind (deswegen auch unhashable). Tuple sind unveränderbar, darum funktioniert bei ihnen auch set. Du kannst also set benutzen wenn du vorher die Listen in Tuple umwandelst:

Code: Alles auswählen

>>> j=[range(5), range(6), range(5), range(5), range(3), range(6)]
>>> set(map(tuple, j))
set([(0, 1, 2), (0, 1, 2, 3, 4, 5), (0, 1, 2, 3, 4)])
>>> map(list, set(map(tuple, j)))
[[0, 1, 2], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4]]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Code: Alles auswählen

>>> listen=[range(5), range(6), range(5), range(5), range(3), range(6)]
>>> map(list,set(map(tuple,listen)))
[[0, 1, 2], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4]]

Edit: "Zwei Schlaue, ein Gedanke." (Goethe?)
Antworten