파이썬 세트에서 '+'를 이해하지 못하는 이유는 무엇입니까?


90

이것이 유효한 이유를 알고 싶습니다.

set(range(10)) - set(range(5))

그러나 이것은 유효하지 않습니다.

set(range(10)) + set(range(5))

'+'가 교차점과 합집합을 모두 의미 할 수 있기 때문입니까?


3
|연합을 의미합니다. 뭘 물어 보는 거냐?
S.Lott 2011 년

13
Guido가 교차로와 결합에 대해 다른 연산자를 선택했기 때문입니다.
David Heffernan 2011 년

3
@David Heffernan, Guido는 일반적으로 이유나 최소한의지도 원칙 없이는 일을하지 않습니다. 이것이 Python을 훌륭하게 만드는 이유입니다.
Mark Ransom 2011 년

1
@ 마크 오, 그가 좋은 이유 때문에 그렇게했다고 확신합니다.
David Heffernan 2011 년

1
~이항 연산자 만 있다면 |+ 유니온과 ~훨씬 더 균형 잡힌 차이를 가질 수 있습니다 .
Matt Joiner 2011 년

답변:


109

Python 세트에는 +연산자에 대한 구현이 없습니다 .

|집합 결합 및 &교차 집합에 사용할 수 있습니다 .

세트는 -세트 차이로 구현 됩니다. ^대칭 세트 차이 에도 사용할 수 있습니다 (즉, 하나의 세트에는 표시되지만 두 세트에는 표시되지 않는 객체 만있는 새 세트를 반환합니다).


2
감사. 나는 몰랐다 | 및 &.
badzil 2011 년

99

set union은 부울 분리와 밀접한 관련이있는 개념이기 때문에 Python이 |대신 사용하기로 선택했습니다 +. 비트 벡터 (파이썬에서는 int/ long)는 일련의 부울 값에 대해이 연산을 정의하고 "비트 또는"라고 부릅니다. 실제로이 연산은 집합 합집합과 매우 유사하여 이진 정수를 "비트 집합"이라고도합니다. 집합의 요소는 자연수로 간주됩니다.

int세트 류 연산자를 이미 |, &및 로 정의 했기 때문에 ^새로운 set유형이 동일한 인터페이스를 사용하는 것은 당연했습니다 .


7
이 답변이 질문의 "왜"를 더 잘 설명한다고 생각합니다.
Greg Hendershott 2011 년

1
아마. 이유는 +1. 그러나 어떤 의미에서 적어도 질문자는 결합과 교차를하는 방법을 아는 것만으로 만족하는 것 같았습니다.
플래티넘 푸른

2
@ 플래티넘 : 저는 실제로 질문에 대답하는 것을 좋아합니다. 그래서 그 질문을 가진 다른 사람이 올 때 모든 합리적인 대답을 볼 수 있습니다. 원래 질문을 한 사람이 이사를가더라도. 우리 둘 사이에 우리는 잘 대답합니다.
SingleNegationElimination 2010 년

1
@TokenMacGuy : "Python이 연산자를 정의하지 않았기 때문에"또한 그 이유에 대해 답합니다. :-P
Platinum Azure

15
나는 그것이 확실하지 않다; "파란색 이니까"는 "하늘이 왜 푸른 색이야?"라고 설명하지 않습니다.
SingleNegationElimination 2010 년

36

집합 이론에서 + 기호는 일반적으로 두 집합 의 분리 된 결합 을 나타냅니다 . A와 B가 세트 인 경우 분리 된 결합이 세트로 정의됩니다.

A + B = {(a, 1) | a in A} U {(b, 2) | b in B}

즉, 분리 된 결합을 구성하기 위해 A의 모든 요소와 B의 모든 요소를 ​​다른 태그로 표시하고 (예에서는 숫자 1과 2를 사용했지만 두 개의 다른 "물건"이 작업을 수행합니다) 두 결과 집합의 합집합. 위의 예에서는 일반적인 수학적 표기법과 더 비슷하게 만들기 위해 집합 결합에 'U'를 사용했습니다. 아래에서는 파이썬 표기법을 사용합니다. 즉 '|' 결합의 경우 '&'는 교차로입니다.

A와 B가 분리 된 경우 A + B는 A | B. 그렇지 않은 경우 A와 B의 모든 공통 요소 x는 A + B에서 두 번 나타납니다. 한 번은 (x, 1)로, 한 번은 (x, 2)로 나타납니다.

따라서 '+'기호는 집합 연산으로 매우 잘 정립 된 의미를 가지고 있기 때문에 파이썬이 집합 결합 또는 교차에이 기호를 사용하지 않는다는 것이 매우 일관 적이라는 것을 알았습니다. 아마도 파이썬 디자이너는 집합 연산자를 선택할 때 이것을 염두에 두었을 것입니다.


5
이것이 최적의 대답입니다. 이 응답을 읽을 때까지 나는 Guido |가 집합 조합에 대해 연산자에 과부하를 걸었던 이유를 grokked했지만 Guido 가 집합 조합에 대해서도 연산자에 과부하를주지 않는 이유를 파악 하지 못했습니다 +. 결국 그렇게하면 +목록 추가를 위해 오버로드 된 연산자 와의 직교성이 유지되었을 것 입니다. Python의 특징은 수학적 표기법 (예 : j복소수의 복잡한 구성 요소 표시)을 따르는 것이므로 Guido의 호기심 많은 선택이 마침내 의미가 있습니다.
Cecil Curry

23

물론, 그들은 +합집합 을 사용했을 수도 있었지만 교차점에 대한 기호가 여전히 필요했습니다. |for union은 &for 교차로와 대칭 이므로 더 나은 선택을합니다.


10

때문에 |수단 조합 및 &수단 교차로. 동일한 기능에 대해 여러 연산자를 추가 할 이유가 분명히 없습니다.

사용하는 이유 |&아마는 비트 연산으로 돌아 간다. 집합을 숫자의 비트로 나타내는 경우 합집합 및 교차를 수행하는 데 사용할 연산자입니다.

+단순함은 결합에 묶여 있지 않고 -차이를 설정하는 것입니다.


3

집합 차이 는 매우 유용하고 일반적으로 알려진 개념 이기 때문에 "집합 추가"라는 개념이 (보편적으로 사용됨) 없습니다.


1
노동 조합? 누군가가 "union"대신 "set 덧셈"이라고 말하거나 ∪? 대신 +를 사용하는 것을 마지막으로 들었을 때입니다. 때때로 멤버 별 덧셈+ 으로 정의됩니다 . 일부는 대칭 차이를 위해 사용합니다 . 어느 쪽이든 그것을 사용하는 모든 논문은 그것을 다른 것으로 부르거나 먼저 정의합니다.
Petr Viktorin 2011 년

1
적절한 용어를 모르는 사람은 그것을 '세트 추가'라고 부를 수 있습니다. 분명히 '조합'이라는 용어를 아는 사람들은 '조합'이라는 용어를 사용합니다.
푹신한
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.