Tengo una lista de listas:
lists = [[1,4,3,2,4], [4,5]]
Quiero aplanar esta lista y eliminar todos los duplicados; o, en otras palabras, aplicar una operación de unión establecida:
desired_result = [1, 2, 3, 4, 5]
¿Cuál es la forma más sencilla de hacer esto?
union()
solo admite múltiples argumentos para Python versión 2.6 o superior. Parece que usa una versión anterior a esa, por lo que probablemente tenga que usar un bucle explícito:total = set(); for x in results_list: total.update(x)
(s /; / \ n /)results_union = set.union(*(set(el) for el in results_list))
TypeError: descriptor 'union' requires a 'set' object but received a 'list'
en Python 3.6 al menos.set.union(*results_list)
, está vinculando el descriptor del método manualmente, es decir, enviando el primer elemento deresults_list
como "self". Esto crea algunas restricciones extrañas: 1. no escribe correctamente el pato (ahora el primer elemento debe ser un conjunto o instancia de una subclase de conjunto), y 2. la unión de un vacíoresults_list
será un error (resultado incorrecto - debería devolver vacío conjunto).Dado que parece estar usando Python 2.5 ( sería bueno mencionar en su Q si necesita una A para las versiones! = 2.6, la producción actual, por cierto ;-) y quiere una lista en lugar de un conjunto como el resultado, recomiendo:
import itertools ... return list(set(itertools.chain(*result_list)))
itertools es generalmente una excelente manera de trabajar con iteradores (y por lo tanto con muchos tipos de secuencias o colecciones) y le recomiendo que se familiarice con él.
itertools.chain
, en particular, se documenta aquí .fuente
itertools
paquete.itertools.chain
Por cierto, también funciona bien en Python 2.4.También puedes 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']
fuente
Las uniones no son compatibles con listas, que están ordenadas, pero son compatibles con conjuntos. Echa un vistazo a set.union .
fuente
Usé lo 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 ]
fuente
en forma de comprensión:
[*{ j for i in lists for j in i }]
o
[*functools.reduce(lambda x,y: {*x, *y}, lists)]
fuente
desired_result = [x for y in lists for x in y]
fuente