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


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.


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

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.


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

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.


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

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.


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


usar a compreensão da lista para efeitos colaterais e com parâmetros anônimos é uma prática muito ruim.
Jean-François Fabre
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.