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.