“|”를 사용하지 않고 한 줄에 두 세트를 결합하는 방법


171

ST세트가 할당 되었다고 가정하십시오 . 결합 연산자를 사용하지 않고 |두 세트의 결합을 어떻게 찾을 수 있습니까? 예를 들어, 교차점을 찾습니다.

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

그래서 어떻게 사용하지 않고 한 줄에 두 세트의 합집합을 찾을 수 |있습니까?


1
노조해야합니까? 그렇다면 s.union (t)
Ansuman Bebarta를

59
왜 사용할 수 |없습니까?
Scott Bartell

1
사용하지 않는 일반적인 이유는 |무엇입니까?
matanster

5
한 가지 이유는 set 연산을 함수 인수로 전달하는 것일 수 있습니다. 다음과 같은 함수를 상상해보십시오 def apply_set_operation(a, b, set_operation). 이 함수를 호출 할 때는 다음을 선호 apply_set_operation(a, b, set.union)합니다.apply_set_operation(a, b, set.__or__)
bsa

답변:


309

세트에 유니온 메소드를 사용할 수 있습니다. set.union(other_set)

새 세트를 반환합니다. 즉, 자체 수정되지 않습니다.


54
그러나 |변수를 인라인으로 수정할 수 있습니다.set_a |= set_b
jorgenkg

13
같은 @jorgenkg : set_a = set_a.union(set_b). 당신은 "자리에서"의미하지, 어느 쪽도 그렇게 할 것입니다, 모두 새로 작성하는 경우set
nitely

3
@jorgenkg 여전히 새 세트를 만들고 참조를 바꿉니다.
Alvaro

3
간단한 테스트에 따르면 @Alvaro @nitely : a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a)@jorgenkg는 맞습니다-변수 a는 인라인으로 수정됩니다. 뭔가 빠졌습니까?
johndodo

3
아니요, 다음과 같이 보이지 않습니다 : a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a). a파괴되었다 하더라도 그렇지 c않았을 것입니다. 또한, c지금 set([1, 2, 3, 4])그래서, @ jorgenkg의 의견은 정확합니다.
johndodo

45

or_별명을 사용할 수 있습니다 .

>>> 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
이 접근 방식을 더 사랑하고 더 기능적이며 2 세트 이상에 적용 할 수 있습니다.
Colin Su

42

원본 세트를 수정하는 것이 좋으면 (어떤 경우에는 할 수 있습니다) 다음을 사용할 수 있습니다 set.update().

S.update(T)

반환 값은입니다 None. 그러나 S원본 S과 의 합집합으로 업데이트됩니다 T.


23

사용할 수 없습니다 또한 가정 s.union(t)에 해당하는 것은 s | t, 당신은 시도 할 수

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

또는 이해를 원한다면

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

14

가입하여 노동 조합을 의미하는 경우 다음을 시도하십시오.

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

그것은 약간의 해킹이지만, 더 좋은 라이너를 생각할 수는 없습니다.


set (list (s) + list (t))는 노조를 할 경우 동일한 결과를 제공합니다.
Ansuman Bebarta

알고 있습니다 만, 내장 된 파이썬 함수를 사용하지 않으려는 것 같습니다. 그렇지 않으면 | 운영자.
BenjaminCohen

listset파이썬 기능이 내장되어 있습니다
whackamadoodle3000

10

2 개의리스트가 있다고 가정하자

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

그래서 당신은 다음과 같이 A유니온 B을 찾을 수 있습니다

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

또한 교차로와 비 교차로를 찾으려면 다음과 같이하십시오.

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

7

다음과 같이 두 세트를 모두 하나로 압축을 풀 수 있습니다.

>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}

*세트를 압축을 풉니 다. 포장 풀기는 iterable (예 : 세트 또는 목록)이 생성하는 모든 항목으로 표시되는 곳입니다. 이러한 수단은 상술 한 실시 예를 단순화 {1, 2, 3, 4, 3, 4, 5, 6}한 다음에 단순화 된 {1, 2, 3, 4, 5, 6}세트는 고유 항목만을 포함 할 수 있기 때문에있다.


*3 행에서 무엇을 합니까?
altabq

5

할 수 union있거나 간단한 목록 이해

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

A는 B의 모든 요소를 ​​갖습니다.


부작용과 익명 매개 변수에 대한 목록 이해를 사용하는 것은 매우 나쁜 습관입니다.
Jean-François Fabre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.