Como unir dois conjuntos em uma linha sem usar "|"

171

Suponha que Se Tsejam conjuntos atribuídos. Sem usar o operador de junção |, como posso encontrar a união dos dois conjuntos? Isto, por exemplo, encontra a interseção:

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

Então, como posso encontrar a união de dois conjuntos em uma linha sem usar |?

fandyst
fonte
1
você precisa se unir? Se sim, então você pode fazer s.union (t)
Ansuman Bebarta
59
Por que você não pode usar |?
Scott Bartell
1
Alguma razão genérica para não usar |?
matanster
5
Um motivo pode estar passando uma operação definida como um argumento de função. Imagine uma função, algo como: def apply_set_operation(a, b, set_operation). Ao chamar esta função, eu prefiro apply_set_operation(a, b, set.union)aapply_set_operation(a, b, set.__or__)
BSA

Respostas:

309

Você pode usar o método de união para conjuntos: set.union(other_set)

Observe que ele retorna um novo conjunto, ou seja, não se modifica.

ovrwngtvity
fonte
54
No entanto, |pode modificar a variável inline:set_a |= set_b
jorgenkg 17/02
13
@jorgenkg mesmo como: set_a = set_a.union(set_b). Se você quer dizer "no local", nenhum dos dois fará isso, ambos criarão um novoset
exatamente
3
@jorgenkg ainda cria um novo conjunto e substitui a referência.
Alvaro
3
@Alvaro @ apenas de acordo com um teste simples a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a):, @jorgenkg está certo - a variável aé modificada em linha. Estou esquecendo de algo?
Johndodo
3
Não, não se parece com isso: a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a). Mesmo se tivesse asido destruído, cnão teria sido. Além disso, cé agora set([1, 2, 3, 4]), então o comentário de @ jorgenkg está correto.
Johndodo 19/0118
45

Você poderia usar o 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
fonte
9
adoro essa abordagem, mais funcional e pode ser aplicada a 2 ou mais conjuntos.
Colin Su
42

Se você está bem com a modificação do conjunto original (o que você pode querer fazer em alguns casos), você pode usar set.update():

S.update(T)

O valor de retorno é None, mas Sserá atualizado para ser a união do original Se T.

Max Candocia
fonte
23

Supondo que você também não possa usar s.union(t), o que equivale a s | t, você pode tentar

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

Ou, se você quiser uma compreensão,

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

Se por união você quer dizer união, tente o seguinte:

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

É um pouco complicado, mas não consigo pensar em um liner melhor para fazê-lo.

BenjaminCohen
fonte
set (list (s) + list (t)) fornecerá o mesmo resultado se você fizer uma união.
Ansuman Bebarta
Estou ciente, mas parece que ele estava tentando evitar o uso de funções python internas, caso contrário, ele teria usado apenas o | operador.
BenjaminCohen
liste setsão construídos em funções do Python
whackamadoodle3000
10

Suponha que você tenha 2 listas

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

para que você possa encontrar a AUnião da Bseguinte forma

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

Além disso, se você deseja encontrar interseção e não interseção, faça o seguinte

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection
iyogeshjoshi
fonte
7

Você pode apenas descompactar os dois conjuntos em um 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}

O *desempacota o aparelho. Descompactar é o local onde um iterável (por exemplo, um conjunto ou lista) é representado como cada item que ele produz. Isso significa que o exemplo acima simplifica para o {1, 2, 3, 4, 3, 4, 5, 6}qual simplifica {1, 2, 3, 4, 5, 6}porque o conjunto pode conter apenas itens exclusivos.

Jamie Saunders
fonte
O que *faz na linha 3?
altabq 14/04
5

Você pode fazer unionou simples lista de compreensão

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

A teria todos os elementos de B

Vaibhav Mishra
fonte
usar a compreensão da lista para efeitos colaterais e com parâmetros anônimos é uma prática muito ruim.
Jean-François Fabre