2014-11-29 6 views
0

에서 "설정의 차이"를 설명해주십시오 내가 만난 다음파이썬을 배우려고 노력 파이썬

>>> set('spam') - set('ham') 
set(['p', 's']) 

는 왜 set(['p', 's'])입니다 - 내 말은 왜 'h'가 없습니다?

+0

왜'h '가 * 포함될 것으로 예상합니까 *? –

+0

나는 차이점을 보여줄 것이라고 생각 했으므로, 내 느낌에서 나는 'h'가 포함될 것으로 예상했다. 내가 잘못한 것 같아. – Rockbot

답변

3

파이썬 세트의 - 연산자는 의 멤버가 아닌 A 세트의 멤버로 정의 된 difference 메서드에 매핑됩니다. 따라서이 경우 의 멤버는 "ham"이 아니며 "s""p"입니다. 이 메서드는 교환 가능하지 않습니다 (즉, a - b == b - a이 항상 true는 아닙니다).

당신은 symmetric_difference 또는 ^ 방법을 찾고있을 수 있습니다

>>> set("spam")^set("ham") 
{'h', 'p', 's'} 

이 연산자 은 교환 법칙이 성립입니다.

+0

나는 [*] ^'연산자]는 설정 차이의 수학 개념에 더 부합합니다 * 오도하는 것입니다. 그것은 * 대칭 * 차이의 수학 개념에 해당하지만 집합 차이에 대한 수학 개념에는 해당하지 않습니다. – NPE

+0

아, 네 말이 맞아. wolfram에 따르면, 집합 차이에 대한 수학적 개념은 실제로 '-'연산자입니다. – jjm

2

집합 차이의 정의이기 때문에. 평이한 영어로 "A에있는 요소는 B에 있지 않습니다"와 동일합니다.

주는 역 동작이 더 분명

>>> set('spam') - set('ham') 
{'s', 'p'} 

>>> set('ham') - set('spam') 
{'h'} 

모든 독특한 요소를 얻으려면, 당신이 요청하는 순서를 무시하면 설정된 차이가 symmetric_difference

>>> set('spam').symmetric_difference(set('ham')) 
{'s', 'h', 'p'} 
+1

여기서'set ('ham')'은 필요 없다. set 메소드는 반복 가능하므로'set ('spam')을 사용한다. symmetric_difference ('ham')'괜찮다. –

1

사용할 수 있습니다 두 번째 집합에없는 첫 번째 집합의 모든 문자 집합입니다. 'p'와 's'는 첫 번째 집합에는 나타나지만 두 번째 집합에는 나타나지 않으므로 집합 차이가 발생합니다. 'h'는 첫 번째 집합에 나타나지 않으므로 첫 번째 집합에 있는지 여부에 관계없이 집합 차이가 아닙니다.

2

두 개의 서로 다른 operators 있습니다

  • 설정의 차이. 이것은 B에없는 A의 요소로 정의되며 A - B 또는 A.difference(B)으로 작성됩니다.
  • 대칭 세트 차이. 이것은 다른 세트에없는 세트의 요소로 정의되며 A^B 또는 A.symmetric_difference(B)으로 작성됩니다.

귀하의 코드는 전자를 사용하고 있지만 귀하는 후자를 기대하는 것 같습니다.

1

또한으로 원하는 결과를 얻을 수 있습니다

>>> (set('spam') | set('ham')) - (set('spam') & set('ham')) 
set(['p', 's', 'h']) 

&를 사용 |교차를 사용 조합 만들기를하고, 즉 의 차이 집합을 수행하십시오의 모든 요소는이고 은 공통 요소입니다.

관련 문제