2014-11-06 10 views
10

Ho una lista di liste come questa:Come fare una serie di liste

i = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]] 

Vorrei ottenere un elenco contenente gli elenchi "unici" (in base ai loro elementi) come:

o = [[1, 2, 3], [2, 4, 5]] 

Non riesco a utilizzare set() in quanto vi sono elementi non selezionabili nell'elenco. Invece, lo sto facendo:

o = [] 
for e in i: 
    if e not in o: 
    o.append(e) 

C'è un modo più semplice per farlo?

risposta

21

È possibile creare un set di tuple, un insieme di elenchi non sarà possibile a causa di elementi non lavabili come menzionato.

>>> l = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]] 
>>> set(tuple(i) for i in l) 
{(1, 2, 3), (2, 4, 5)} 
+7

o '{tupla (i) per i in l}' – wim

+2

@wim +1, anche se trovo il 'set' più intuitivo; la maggior parte delle volte vedo un '{', sto pensando ad un dizionario :) –

+0

Giusto per chiarire: un insieme di tuple di tipi non selezionabili, come 'set (([], {}))' non funzionerà neanche. – bereal

2

È possibile convertire ciascun elemento in una tupla e quindi inserirlo in un set.

Ecco alcuni codice con il tuo esempio:

tmp = set() 
a = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]] 
for i in a: 
    tmp.add(tuple(i)) 

tmp sarà simile a questo:

{(1, 2, 3), (2, 4, 5)} 
4
i = [[1, 2, 3], [2, 4, 5], [1, 2, 3], [2, 4, 5]] 

print([ele for ind, ele in enumerate(i) if ele not in i[:ind]]) 
[[1, 2, 3], [2, 4, 5]] 

Se si considera [2, 4, 5] essere pari a [2, 5, 4] allora si avrà bisogno di fare ulteriori assegni

+0

+1 Risposta intelligente! – Phani

+0

set sono quasi sempre la strada da percorrere, ma a volte le cose non possono essere con hash –

+0

, buona osservazione, cosa succede se l'ordine è diverso? –