Pythonic manera de crear unión de todos los valores contenidos en las Listas Múltiples
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)
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]