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 |?

fandyst
fuente
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.

ovrwngtvity
fuente
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])
Alexander Klimenko
fuente
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.

Max Candocia
fuente
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])
arshajii
fuente
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.

BenjaminCohen
fuente
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
iyogeshjoshi
fuente
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.

Jamie Saunders
fuente
¿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

Vaibhav Mishra
fuente
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