이것이 유효한 이유를 알고 싶습니다.
set(range(10)) - set(range(5))
그러나 이것은 유효하지 않습니다.
set(range(10)) + set(range(5))
'+'가 교차점과 합집합을 모두 의미 할 수 있기 때문입니까?
이것이 유효한 이유를 알고 싶습니다.
set(range(10)) - set(range(5))
그러나 이것은 유효하지 않습니다.
set(range(10)) + set(range(5))
'+'가 교차점과 합집합을 모두 의미 할 수 있기 때문입니까?
~
이항 연산자 만 있다면 |
+ 유니온과 ~
훨씬 더 균형 잡힌 차이를 가질 수 있습니다 .
답변:
Python 세트에는 +
연산자에 대한 구현이 없습니다 .
|
집합 결합 및 &
교차 집합에 사용할 수 있습니다 .
세트는 -
세트 차이로 구현 됩니다. ^
대칭 세트 차이 에도 사용할 수 있습니다 (즉, 하나의 세트에는 표시되지만 두 세트에는 표시되지 않는 객체 만있는 새 세트를 반환합니다).
set union은 부울 분리와 밀접한 관련이있는 개념이기 때문에 Python이 |
대신 사용하기로 선택했습니다 +
. 비트 벡터 (파이썬에서는 int
/ long
)는 일련의 부울 값에 대해이 연산을 정의하고 "비트 또는"라고 부릅니다. 실제로이 연산은 집합 합집합과 매우 유사하여 이진 정수를 "비트 집합"이라고도합니다. 집합의 요소는 자연수로 간주됩니다.
int
세트 류 연산자를 이미 |
, &
및 로 정의 했기 때문에 ^
새로운 set
유형이 동일한 인터페이스를 사용하는 것은 당연했습니다 .
집합 이론에서 + 기호는 일반적으로 두 집합 의 분리 된 결합 을 나타냅니다 . 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)로 나타납니다.
따라서 '+'기호는 집합 연산으로 매우 잘 정립 된 의미를 가지고 있기 때문에 파이썬이 집합 결합 또는 교차에이 기호를 사용하지 않는다는 것이 매우 일관 적이라는 것을 알았습니다. 아마도 파이썬 디자이너는 집합 연산자를 선택할 때 이것을 염두에 두었을 것입니다.
|
가 집합 조합에 대해 연산자에 과부하를 걸었던 이유를 grokked했지만 Guido 가 집합 조합에 대해서도 연산자에 과부하를주지 않는 이유를 파악 하지 못했습니다 +
. 결국 그렇게하면 +
목록 추가를 위해 오버로드 된 연산자 와의 직교성이 유지되었을 것 입니다. Python의 특징은 수학적 표기법 (예 : j
복소수의 복잡한 구성 요소 표시)을 따르는 것이므로 Guido의 호기심 많은 선택이 마침내 의미가 있습니다.
집합 차이 는 매우 유용하고 일반적으로 알려진 개념 이기 때문에 "집합 추가"라는 개념이 (보편적으로 사용됨) 없습니다.
+
으로 정의됩니다 . 일부는 대칭 차이를 위해 사용합니다 . 어느 쪽이든 그것을 사용하는 모든 논문은 그것을 다른 것으로 부르거나 먼저 정의합니다.
|
연합을 의미합니다. 뭘 물어 보는 거냐?