2010-09-29 10 views
7

Ho un 2-d serierimuovere voci duplicate da multi-d array in pitone

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

Ora sto cercando di rimuovere voci duplicate da esso. Per semplice array 1-D, codice semplice come

xx=list(set(xx)) 

funzionerebbe. Ma cercando impostata su elementi 2-d dà un errore

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

Una soluzione potrebbe essere quella di serializzare gli elementi xx, e poi fare un elenco (set()) sul nuovo array e poi unserialize tutti gli elementi di nuovo.

C'è qualche soluzione in python?

risposta

16

Convertire elementi in tupla e quindi utilizzare set.

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

Le tuple, a differenza degli elenchi, possono essere sottoposte a hash. Quindi. E una volta che hai finito, converti gli elementi di nuovo in lista. Mettendo tutto insieme:

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

in qualche modo il codice non è riuscito a rimuovere le voci duplicate. set() non è in grado di rilevare tuple duplicate? – Neo

+0

@Neo: questo diventa interessante. Puoi pubblicare alcuni valori di esempio? –

+0

stringa e il numero dello stesso valore o quasi lo stesso numero in virgola mobile forse? –

3

Un anno dopo l'ottima risposta di Manoj Govindan, sto aggiungendo il mio consiglio:

galleggianti numeri punti sono solo un dolore se si desidera confrontare le cose ...

Ad esempio,

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

False

Questo perché il computer non può rappresentare con precisione Floating Points decimali come numeri binari (i computer gestiscono base di binario/2 solo numeri, non decimali/base 10).

Quindi stai molto attento quando confronti i galleggianti!

Problemi correlati