2010-09-16 5 views
23

Ich bin gespannt, was eine effient Möglichkeit, Objekte von uniquefying solcher Daten wäre: auf dem rechten SeitePython: Einmaligkeit für die Liste der Listen

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

Für jedes Datenpaar, links Ziffernfolge PLUS die Art erzählt die Einzigartigkeit ein Datenelement Und es gibt eine Liste von Listen zurück, die mit den Testdaten identisch sind, aber nur Unikate existieren.

Grüße

Antwort

51

Sie einen Satz verwenden:

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

Sie auch this page sehen können, die eine Vielzahl von Methoden Benchmarks, die entweder zu erhalten oder nicht, um bewahren.

+0

Beachten Sie, dass Sie die Reihenfolge mit dieser Methode verlieren. Wenn es relevant ist, müssen Sie es nach sortieren oder die Elemente manuell entfernen. – Wolph

+1

Ich erhalte einen Fehler: 'TypeError: nicht hashbarer Typ: 'list''. Python 2.6.2, Ubuntu Jaunty. –

+0

@Hellnar: Er hat nur den Code aktualisiert, um ein Tupel zu verwenden, jetzt bekommst du dieses Problem nicht mehr :) – Wolph

5

Ich versuchte @ Marks Antwort und bekam einen Fehler. Das Konvertieren der Liste und jeder Elemente in ein Tupel hat es funktioniert. Nicht sicher, ob dies der beste Weg ist.

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

Natürlich kann das gleiche auch mit einem Listenverständnis ausgedrückt werden.

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

Ich benutze Python 2.6.2.

aktualisieren

@ Mark seine Antwort da geändert hat. Seine aktuelle Antwort verwendet Tupel und wird funktionieren. So wird mein :)

aktualisieren 2

Dank @ Mark. Ich habe meine Antwort geändert, um eine Liste von Listen anstelle einer Liste von Tupeln zurückzugeben.

+0

@Mark: fertig. Vielen Dank! –

+0

Hier ist ein kleiner Trick: Statt 'Lambda x: foo (x)' kannst du einfach 'foo' schreiben. –

+0

@Mark: Wo 'foo' ist aufrufbar. Erwischt. –

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

Die anderen Antworten sind viel cooler! – pyfunc

+2

Außerdem ist das Mengenmodul veraltet, stattdessen wird der integrierte Set-Typ verwendet. –