2010-09-16 20 views
23

Jestem ciekaw, co byłoby effient sposób uniquefying takich obiektów danych:Python: Wyjątkowość na liście list

testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH'] 
] 

Dla każdej pary danych, lewy ciąg liczbowy PLUS typ po prawej stronie informuje o wyjątkowości element danych. I zwraca listę list tak samo jak dane testowe, ale istnieją tylko unikaty.

Pozdrowienia

Odpowiedz

51

można użyć zestawu:

unique_data = [list(x) for x in set(tuple(x) for x in testdata)] 

można również zobaczyć this page który Benchmarki różnych metod, które albo zachowania lub nie zachowania porządku.

+0

Należy pamiętać, że zgubisz zamówienie za pomocą tej metody. Jeśli jest to istotne, musisz je posortować po lub ręcznie usunąć. – Wolph

+1

Występuje błąd: 'TypeError: unhashable type: 'list''. Python 2.6.2, Ubuntu Jaunty. –

+0

@Hellnar: po prostu zaktualizował kod, aby użyć krotki, teraz już nie będziesz mieć tego problemu :) – Wolph

5

Próbowałem odpowiedzi @ Mark i dostałem błąd. Konwertowanie listy i poszczególnych elementów w krotkę sprawiło, że działało. Nie jestem pewien, czy to najlepszy sposób.

list(map(list, set(map(lambda i: tuple(i), testdata)))) 

Oczywiście to samo można wyrazić za pomocą rozumienia listy.

[list(i) for i in set(tuple(i) for i in testdata)] 

Używam Python 2.6.2.

Aktualizacja

@Mark od tego czasu zmienił swoją odpowiedź. Jego obecna odpowiedź używa krotek i będzie działać. Tak będzie mój :)

UPDATE 2

Dzięki @Mark. Zmieniłem swoją odpowiedź, aby zwrócić listę list, a nie listę krotek.

+0

@ Mark: done. Dzięki! –

+0

Oto mała sztuczka: zamiast 'lambda x: foo (x)' możesz po prostu napisać 'foo'. –

+0

@ Mark: Gdzie 'foo' jest wywoływalne. Mam cię. –

1
import sets 
testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']] 
conacatData = [x[0] + x[1] for x in testdata] 
print conacatData 
uniqueSet = sets.Set(conacatData) 
uniqueList = [ [t[0:-3], t[-3:]] for t in uniqueSet] 
print uniqueList 
+0

Inne odpowiedzi są o wiele fajniejsze! – pyfunc

+2

Ponadto moduł zestawów jest przestarzały, zamiast niego należy użyć wbudowanego typu zestawu. –