Pythonic manera de crear unión de todos los valores contenidos en las Listas Múltiples

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

  •  23-09-2019
  •  | 
  •  

Pregunta

Tengo una lista de listas:

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

Quiero aplanar esta lista y eliminar todos los duplicados; o, dicho de otro modo, aplicar una operación de unión de conjuntos:

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

¿Cuál es la manera más fácil de hacer esto? (Estoy obligado a usar Python 2.4 para este proyecto)

¿Fue útil?

Solución

set.union hace lo que quiere:

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

También puede hacer esto con más de dos listas.

Otros consejos

Ya que parece ser el uso de Python 2.5 (que haría bueno mencionar en su Q si necesita una A por versiones! = 2,6, la actual producción, por cierto ;-) y desea una lista en lugar de un conjunto como el resultado, recomiendo:

   import itertools

   ...

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

itertools es generalmente una gran manera de trabajar con iteradores (y así con muchos tipos de secuencias o colecciones) y yo recomiendo que se familiarice con ella. itertools.chain, en particular, está documentado aquí .

Uniones no son compatibles con las listas, que están ordenados, pero son soportados por conjuntos. Echa un vistazo a set.union .

He utilizado el siguiente para hacer intersecciones, lo que evita la necesidad de conjuntos.

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 ]

También puede seguir este estilo

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]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top