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

4 minutos de lectura

avatar de usuario
fanático

Asumir que S y T son 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 |?

  • necesitas unión? Si es así, entonces puedes hacer s.union

    – Ansumán Bebarta

    2 de julio de 2013 a las 15:12

  • ¿Por qué no puedes usar |?

    –Scott Bartell

    7 sep 2014 a las 20:45


  • Cualquier razón genérica para no usar | ?

    – matanster

    28 de marzo de 2019 a las 17:46


  • Una razón podría ser pasar una operación de conjunto como un argumento de función. Imagina una función, algo como: def apply_set_operation(a, b, set_operation). Al llamar a esta función, preferiría apply_set_operation(a, b, set.union) a apply_set_operation(a, b, set.__or__)

    – bsa

    20 de mayo de 2019 a las 1:11

  • ¿Cuál es el caso de uso de una función para abstraer operaciones de conjuntos? ¿Por qué no simplemente hacer a | b en lugar de llamar a una función para hacer eso?

    – rodrigo-silveira

    23 de enero de 2021 a las 0:13

avatar de usuario
ovrwngtvity

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.

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

    – jorgenkg

    17 de febrero de 2016 a las 19:13

  • @jorgenkg igual que: set_a = set_a.union(set_b). Si quiere decir “en el lugar”, ninguno lo hará, ambos crean un nuevo set

    – por la noche

    10 de noviembre de 2016 a las 2:22


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

    – Álvaro

    25 de enero de 2017 a las 21:12

  • @Alvaro @nitely según 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 – variable a se modifica en línea. ¿Me estoy perdiendo de algo?

    – johndodo

    7 de enero de 2018 a las 10:06

  • No, no lo parece: a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a). Incluso si a fue destruido, c no hubiera sido También, c es ahora set([1, 2, 3, 4])entonces el comentario de @jorgenkg es correcto.

    – johndodo

    19 de enero de 2018 a las 10:07


avatar de usuario
Alejandro Klimenko

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])

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

    – Colin Su

    23 de abril de 2014 a las 1:38

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 Nonepero S se actualizará para ser la unión del original S y T.

avatar de usuario
arshajii

Asumiendo que tampoco puedes usar s.union

>>> 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])

avatar de usuario
jamie saunders

Simplemente puede desempaquetar 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}

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

  • Lo que hace el * hacer en la línea 3?

    – altabq

    14 de abril de 2020 a las 14:32

  • @altabq Él responde qué expresiones destacadas están en la respuesta. Prueba también a jugar con él en el REPL. Mira qué print(set_1) contra print(*set_1) parece. También esto puede darle más información: stackoverflow.com/questions/12555627/…

    – Aarón Bell

    1 de enero de 2021 a las 2:52

  • Gracias @aaron-bell, la respuesta se editó después de que publiqué mi comentario para incluir la explicación.

    – altabq

    12 de enero de 2021 a las 16:34

avatar de usuario
Alois Mahdal

Si por unión te refieres a unión, prueba esto:

set(list(s) + list

Es un truco, pero no puedo pensar en una mejor línea para hacerlo.

  • Lo que hace el * hacer en la línea 3?

    – altabq

    14 de abril de 2020 a las 14:32

  • @altabq Él responde qué expresiones destacadas están en la respuesta. Prueba también a jugar con él en el REPL. Mira qué print(set_1) contra print(*set_1) parece. También esto puede darle más información: stackoverflow.com/questions/12555627/…

    – Aarón Bell

    1 de enero de 2021 a las 2:52

  • Gracias @aaron-bell, la respuesta se editó después de que publiqué mi comentario para incluir la explicación.

    – altabq

    12 de enero de 2021 a las 16:34

avatar de usuario
yogeshjoshi

Supongamos que tiene 2 listas

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

para que puedas encontrar A Unión B de la siguiente manera

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

también si desea encontrar intersección y no intersección, hágalo de la siguiente manera

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad