2010-09-16 1 views
23

Sono curioso quello che sarebbe un modo effient di uniquefying tali oggetti dati:Python: unicità per lista di liste

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

Per ogni coppia di dati, stringa numerica sinistra PLUS il tipo a destra racconta l'unicità di un elemento di dati. E restituisce una lista di liste uguale a quella dei test, ma esistono solo gli uniques.

saluti

risposta

51

È possibile utilizzare un set:

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

è anche possibile vedere this page quale benchmark una varietà di metodi che o preservano o non mantenere l'ordine.

+0

Si noti che si perde l'ordine con questo metodo. Se è rilevante di quanto dovrai ordinare dopo o rimuovere gli elementi manualmente. – Wolph

+1

Ricevo un errore: 'TypeError: tipo non selezionabile: 'list''. Python 2.6.2, Ubuntu Jaunty. –

+0

@Hellnar: ha appena aggiornato il codice per utilizzare una tupla, ora non sarà possibile ottenere il problema più :) – Wolph

5

Ho provato @ risposta di Marco e ottenuto un errore. La conversione dell'elenco e di ogni elemento in una tupla ha funzionato. Non sono sicuro se questo è il modo migliore però.

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

Naturalmente la stessa cosa può essere espresso con una lista di comprensione, invece.

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

Sto usando Python 2.6.2.

Aggiornamento

@ Marco da allora ha cambiato la sua risposta. La sua attuale risposta usa le tuple e funzionerà. Così sarà la mia :)

Aggiornamento 2

Grazie a @ Marco. Ho cambiato la mia risposta per restituire una lista di liste piuttosto che una lista di tuple.

+0

@Mark: done. Grazie! –

+0

Ecco un piccolo trucco: invece di 'lambda x: foo (x)' puoi semplicemente scrivere 'foo'. –

+0

@Mark: dove 'foo' è un callable. Gotcha. –

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

Le altre risposte sono decisamente migliori! – pyfunc

+2

Inoltre, il modulo set è deprecato, usa invece il set-type integrato. –