Way divinatorio per creare unione di tutti i valori contenuti negli elenchi multipli

StackOverflow https://stackoverflow.com/questions/2151517

  •  23-09-2019
  •  | 
  •  

Domanda

Ho una lista di liste:

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

Voglio appiattire questa lista e rimuovere tutti i duplicati; o, in altre parole, applicare un'operazione di impostazione union:

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

Qual è il modo più semplice per farlo? (Sono costretto a utilizzare Python 2.4 per questo progetto)

È stato utile?

Soluzione

set.union fa ciò che si vuole:

>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])

È anche possibile fare questo con più di due liste.

Altri suggerimenti

Dal momento che sembra essere utilizzando Python 2.5 (si sarebbe bello parlare nella vostra Q se avete bisogno di una A per le versioni! = 2.6, l'attuale produzione uno, tra l'altro ;-) e vogliono un elenco piuttosto che un insieme come risultato, vi consiglio:

   import itertools

   ...

   return list(set(itertools.chain(*result_list)))

itertools è in genere un ottimo modo per lavorare con iteratori (e quindi con molti tipi di sequenze o collezioni) e io consiglio vivamente di acquisire familiarità con esso. itertools.chain, in particolare, è documentata qui .

I sindacati non sono supportati da liste, che vengono ordinati, ma sono supportati da set. Scopri set.union .

Ho usato il seguente per fare incroci, che evita la necessità per i set.

a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)

o

s = [ x for x in b if x in a ]

Potete anche seguire questo stile

In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']

In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']

In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']    
desired_result = [x for y in lists for x in y]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top