2010-09-29 8 views
7

Mam tablicy 2-Dusuwając zduplikowane wpisy z multi-d tablicy w Pythonie

xx=[[a,1],[b,2],[c,3]] 

Teraz próbuję usunąć zduplikowane wpisy z niego. W przypadku prostej macierzy 1-D prosty kod, taki jak

xx=list(set(xx)) 

zadziała. Ale starając ustawiony na 2-D elementów daje błąd

temp = set(xx) 
TypeError: unhashable type: 'list' 

Jeden obejście byłoby serializacji elementy xx, a następnie zrobić listę (set()) na nowej tablicy i następnie unserialize wszystkie elementy powrotem.

Czy istnieje jakieś rozwiązanie w Python?

Odpowiedz

16

Konwertuj elementy na krotkę, a następnie użyj set.

>>> xx=[['a',1],['b',2],['c',3],['c',3]] 
>>> set(tuple(element) for element in xx) 
set([('a', 1), ('b', 2), ('c', 3)]) 
>>> 

Krotki, w przeciwieństwie do list, mogą być mieszane. Stąd. A gdy skończysz, przekonwertuj elementy z powrotem na listę. Wprowadzenie wszystko razem:

>>> [list(t) for t in set(tuple(element) for element in xx)] 
[['a', 1], ['b', 2], ['c', 3]] 
+0

jakoś kod nie zdołał usunąć duplikatów. set() nie jest w stanie wykryć duplikatów krotek? – Neo

+0

@Neo: To staje się interesujące. Czy możesz podać niektóre przykładowe wartości? –

+0

ciąg i numer tej samej wartości lub prawie takie same liczby zmiennoprzecinkowe może? –

3

Rok po doskonałą odpowiedź na Manoj Govindan, dodaję moją radę:

Pływające punktów numery to tylko ból, jeśli chcesz porównać rzeczy ...

Przykładowo

>>> + 0,1 + 0,1 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 == 0,1 * 10

Fałsz

To dlatego, że komputer nie może dokładnie reprezentować dziesiętnych punktów pływający jako liczb binarnych (komputery obsługiwać binarne/podstawa 2 numery tylko nie dziesiętnych/Base 10).

Bądź więc bardzo ostrożny przy porównywaniu pływaków!

Powiązane problemy