2015-06-01 42 views
10

Voglio creare una lista (o un insieme) di tutti i valori univoci che appaiono in una lista di liste in python. ho qualcosa di simile a questo:Ottieni valori univoci nell'elenco delle liste in python

aList=[['a','b'], ['a', 'b','c'], ['a']] 

e vorrei il seguente:

unique_values=['a','b','c'] 

so che per una lista di stringhe si può semplicemente usare set (aList), ma non ci riesco capire come risolvere questo in una lista di liste, in quanto set (aList) mi viene il messaggio di errore

unhashable type: 'list' 

come posso risolverlo?

+0

È possibile appiattire la lista prima. https://stackoverflow.com/search?q=[python]+flatten+list (fyi, in Python questi sono chiamati liste, non array) –

+0

Grazie, non sapevo quale fosse corretto;) – mihasa

+0

Ho visto che la mia lista è abbastanza grande, ho intuito che in termini di efficienza sarebbe una brutta telefonata – mihasa

risposta

13
array = [['a','b'], ['a', 'b','c'], ['a']] 
result = set(x for l in array for x in l) 
+0

ha fatto il lavoro, grazie mille! Non c'è un modo migliore per fare questo tipo di pensare senza aver bisogno di iterare? (Sono un principiante ma ho pensato che evitare i loop era la strada da percorrere quando si ha una grande len (array)) – mihasa

+0

Ho paura che non ci sia un modo più semplice. Hai una struttura di input definita con precisione, hai una struttura di output definita con precisione ed è necessario effettuare la conversione. Poiché la conversione coinvolge tutti gli elementi è necessario "visitarli" tutti. Bene, ci sono molti modi per ottenere il risultato (vedi altri post) ma l'iterazione è sempre presente internamente. – dlask

3
array = [['a','b'], ['a', 'b','c'], ['a']] 
unique_values = list(reduce(lambda i, j: set(i) | set(j), array)) 
7

È possibile utilizzare itertools s' chain per appiattire la matrice e quindi chiamare set su di esso:

from itertools import chain 

array = [['a','b'], ['a', 'b','c'], ['a']] 
print set(chain(*array)) 

Se vi aspettate un oggetto list:

print list(set(chain(*array))) 
+0

che ha funzionato anche, grazie! – mihasa

+0

@mihasa Alza e accetta se è stato utile. Grazie –

+0

ho appena creato il mio account, non posso ancora creare nulla :(La tua risposta è stata molto utile, ma ho accettato la prima risposta: quando ho abbastanza punti (o idk che dà permition di aumentare le risposte) lo farò per il tuo – mihasa

3

È possibile utilizzare numpy.unique:

import numpy 
import operator 
print numpy.unique(reduce(operator.add, [['a','b'], ['a', 'b','c'], ['a']])) 
# ['a' 'b' 'c'] 
0

Provare a questo.

array = [['a','b'], ['a', 'b','c'], ['a']] 
res=() 
for item in array: 
    res = list(set(res) | set(item)) 
print res 

uscita:

['a', 'c', 'b']