Cómo unir dos conjuntos en una línea sin usar "|"


171

Asume eso Sy Tson conjuntos asignados. Sin usar el operador de unión |, ¿cómo puedo encontrar la unión de los dos conjuntos? Esto, por ejemplo, encuentra la intersección:

S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
S_intersect_T = { i for i in S if i in T }

Entonces, ¿cómo puedo encontrar la unión de dos conjuntos en una línea sin usar |?


1
¿Necesitas unión? En caso afirmativo, puede hacerlo en la unión (t)
Ansuman Bebarta 02 de

59
¿Por qué no puedes usar |?
Scott Bartell

1
¿Alguna razón genérica para no usar |?
matanster

55
Una razón podría ser pasar una operación de conjunto como argumento de función. Imagínese una función, algo así como: def apply_set_operation(a, b, set_operation). Cuando se llama a esta función, preferiría apply_set_operation(a, b, set.union)aapply_set_operation(a, b, set.__or__)
BSA

Respuestas:


309

Puede usar el método de unión para conjuntos: set.union(other_set)

Tenga en cuenta que devuelve un nuevo conjunto, es decir, no se modifica a sí mismo.


54
Sin embargo, |puede modificar la variable en línea:set_a |= set_b
jorgenkg

13
@jorgenkg mismo que: set_a = set_a.union(set_b). Si se refiere a "in situ", no va a hacer que, tanto crear un nuevoset
nitivamente

3
@jorgenkg todavía crea un nuevo conjunto y reemplaza la referencia.
Alvaro

3
@Alvaro @nitely de acuerdo con una prueba simple: a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a)@jorgenkg tiene razón: la variable ase modifica en línea. ¿Me estoy perdiendo de algo?
johndodo

3
No, no se parece a ella: a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a). Incluso si afue destruido, cno lo habría sido. Además, ces ahora set([1, 2, 3, 4]), así que el comentario de @ jorgenkg es correcto.
johndodo

45

Podrías usar or_alias:

>>> from operator import or_
>>> from functools import reduce # python3 required
>>> reduce(or_, [{1, 2, 3, 4}, {3, 4, 5, 6}])
set([1, 2, 3, 4, 5, 6])

9
Me encanta este enfoque, más funcional, y podría aplicarse a 2 o más conjuntos.
Colin Su

42

Si está de acuerdo con modificar el conjunto original (que es posible que desee hacer en algunos casos), puede usar set.update():

S.update(T)

El valor de retorno es None, pero Sse actualizará para ser la unión del original Sy T.


23

Suponiendo que tampoco puede usar s.union(t), lo que es equivalente a s | t, podría intentar

>>> from itertools import chain
>>> set(chain(s,t))
set([1, 2, 3, 4, 5, 6])

O, si quieres una comprensión,

>>> {i for j in (s,t) for i in j}
set([1, 2, 3, 4, 5, 6])

14

Si por unirse quieres decir unión, prueba esto:

set(list(s) + list(t))

Es un truco, pero no puedo pensar en un mejor revestimiento para hacerlo.


set (list (s) + list (t)) le dará el mismo resultado si realiza una unión.
Ansuman Bebarta

Soy consciente, pero parece que estaba tratando de evitar el uso de las funciones integradas de Python, de lo contrario, simplemente habría utilizado el | operador.
BenjaminCohen

listy setestán construidas en funciones de python
whackamadoodle3000

10

Supongamos que tienes 2 listas

 A = [1,2,3,4]
 B = [3,4,5,6]

para que pueda encontrar AUnion de la Bsiguiente manera

 union = set(A).union(set(B))

Además, si desea encontrar intersección y no intersección, haga lo siguiente

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection

7

Puede descomprimir ambos conjuntos en uno como este:

>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}

El *desempaqueta el conjunto. Desempaquetar es donde un iterable (por ejemplo, un conjunto o lista) se representa como cada elemento que produce. Esto significa que el ejemplo anterior se simplifica y {1, 2, 3, 4, 3, 4, 5, 6}luego se simplifica {1, 2, 3, 4, 5, 6}porque el conjunto solo puede contener elementos únicos.


¿Qué hace el *en la línea 3?
altabq

5

Puedes hacer uniono simplemente listar la comprensión

[A.add(_) for _ in B]

A tendría todos los elementos de B


Usar la comprensión de la lista para los efectos secundarios y con parámetros anónimos es una práctica súper mala.
Jean-François Fabre
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.