Seite 1 von 1

Doppelte Elemente aus Liste löschen

Verfasst: Samstag 16. Mai 2009, 15:05
von Pascal
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

Verfasst: Samstag 16. Mai 2009, 15:12
von derdon

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]]

Verfasst: Samstag 16. Mai 2009, 15:51
von lunar
Vielleicht solltest du deine Datenstruktur überdenken, denn sowas lässt sich nicht effizient implementieren.

Verfasst: Samstag 16. Mai 2009, 16:13
von HerrHagen
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]]

Verfasst: Samstag 16. Mai 2009, 16:14
von numerix

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?)