26.2 집합 연산 사용하기

이제 세트에서 집합 연산과 이에 대응하는 메서드를 사용해보겠습니다. 집합 연산은 파이썬의 산술 연산자와 논리 연산자를 활용합니다.

| 연산자는 합집합(union)을 구하며 OR 연산자 |를 사용합니다. set.union 메서드와 동작이 같습니다. 다음은 세트 {1, 2, 3, 4}{3, 4, 5, 6}을 모두 포함하므로 {1, 2, 3, 4, 5, 6}이 나옵니다.

  • 세트1 | 세트2
  • set.union(세트1, 세트2)
>>> a = {1, 2, 3, 4}
>>> b = {3, 4, 5, 6}
>>> a | b
{1, 2, 3, 4, 5, 6}
>>> set.union(a, b)
{1, 2, 3, 4, 5, 6}
그림 26-1 세트의 합집합 연산

& 연산자는 교집합(intersection)을 구하며 AND 연산자 &를 사용합니다. set.intersection 메서드와 동작이 같습니다. 다음은 세트 {1, 2, 3, 4}{3, 4, 5, 6} 중에서 겹치는 부분을 구하므로 {3, 4}가 나옵니다.

  • 세트1 & 세트2
  • set.intersection(세트1, 세트2)
>>> a & b
{3, 4}
>>> set.intersection(a, b)
{3, 4}
그림 26-2 세트의 교집합 연산

- 연산자는 차집합(difference)을 구하며 뺄셈 연산자 -를 사용합니다. set.defference 메서드와 동작이 같습니다. 다음은 {1, 2, 3, 4}에서 {3, 4, 5, 6}과 겹치는 3과 4를 뺐으므로 {1, 2}가 나옵니다.

  • 세트1 - 세트2
  • set.difference(세트1, 세트2)
>>> a - b
{1, 2}
>>> set.difference(a, b)
{1, 2}
그림 26-3 세트의 차집합 연산

^ 연산자는 대칭차집합(symmetric difference)을 구하며 XOR 연산자 ^를 사용합니다. set.symmetric_difference 메서드와 동작이 같습니다.

대칭차집합은 XOR 연산자의 특성을 그대로 따르는데 XOR은 서로 다르면 참입니다. 따라서 집합에서는 두 집합 중 겹치지 않는 요소만 포함합니다. 다음은 세트 {1, 2, 3, 4}{3, 4, 5, 6} 중에서 같은 값 3과 4를 제외한 다른 모든 요소를 구하므로 {1, 2, 5, 6}이 나옵니다.

  • 세트1 ^ 세트2
  • set.symmetric_difference(세트1, 세트2)
>>> a ^ b
{1, 2, 5, 6}
>>> set.symmetric_difference(a, b)
{1, 2, 5, 6}
그림 26-4 세트의 대칭차집합 연산

26.2.1  집합 연산 후 할당 연산자 사용하기

이번에는 세트 자료형에 집합 연산 후 할당 연산자와 이에 대응하는 메서드를 사용해보겠습니다. 세트 자료형에 |, &, -, ^ 연산자와 할당 연산자 =을 함께 사용하면 집합 연산의 결과를 변수에 다시 저장(할당)합니다.

|=은 현재 세트에 다른 세트를 더하며 update 메서드와 같습니다. 다음은 세트 {1, 2, 3, 4}{5}를 더하므로 {1, 2, 3, 4, 5}가 나옵니다.

  • 세트1 |= 세트2
  • 세트1.update(세트2)
>>> a = {1, 2, 3, 4}
>>> a |= {5}
>>> a
{1, 2, 3, 4, 5}
>>> a = {1, 2, 3, 4}
>>> a.update({5})
>>> a
{1, 2, 3, 4, 5}

&=은 현재 세트와 다른 세트 중에서 겹치는 요소만 현재 세트에 저장하며 intersection_update 메서드와 같습니다. 다음은 세트 {1, 2, 3, 4}{0, 1, 2, 3, 4} 중에서 겹치는 요소만 a에 저장하므로 {1, 2, 3, 4}가 나옵니다.

  • 세트1 &= 세트2
  • 세트1.intersection_update(세트2)
>>> a = {1, 2, 3, 4}
>>> a &= {0, 1, 2, 3, 4}
>>> a
{1, 2, 3, 4}
>>> a = {1, 2, 3, 4}
>>> a.intersection_update({0, 1, 2, 3, 4})
>>> a
{1, 2, 3, 4}

-=은 현재 세트에서 다른 세트를 빼며 difference_update 메서드와 같습니다. 다음은 세트 {1, 2, 3, 4}에서 {3}을 빼므로 {1, 2, 4}가 나옵니다.

  • 세트1 -= 세트2
  • 세트1.difference_update(세트2)
>>> a = {1, 2, 3, 4}
>>> a -= {3}
>>> a
{1, 2, 4}
>>> a = {1, 2, 3, 4}
>>> a.difference_update({3})
>>> a
{1, 2, 4}

^=은 현재 세트와 다른 세트 중에서 겹치지 않는 요소만 현재 세트에 저장하며 symmetric_difference_update 메서드와 같습니다. 다음은 세트 {1, 2, 3, 4}{3, 4, 5, 6} 중에서 겹치지 않는 요소만 a에 저장하므로 {1, 3}이 나옵니다.

  • 세트1 ^= 세트2
  • 세트1.symmetric_difference_update(세트2)
>>> a = {1, 2, 3, 4}
>>> a ^= {3, 4, 5, 6}
>>> a
{1, 2, 5, 6}
>>> a = {1, 2, 3, 4}
>>> a.symmetric_difference_update({3, 4, 5, 6})
>>> a
{1, 2, 5, 6}

26.2.2  부분 집합과 상위집합 확인하기

세트는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 표현할 수도 있습니다. 현재 세트가 다른 세트의 (진)부분집합 또는 (진)상위집합인지 확인할 때는 세트 자료형에 부등호와 등호 사용합니다.

<=은 현재 세트가 다른 세트의 부분집합(subset)인지 확인하며 issubset 메서드와 같습니다. 다음은 세트 {1, 2, 3, 4}{1, 2, 3, 4}의 부분집합이므로 참입니다(등호가 있으므로 두 세트가 같을 때도 참입니다).

  • 현재세트 <= 다른세트
  • 현재세트.issubset(다른세트)
>>> a = {1, 2, 3, 4}
>>> a <= {1, 2, 3, 4}
True
>>> a.issubset({1, 2, 3, 4, 5})
True
그림 26-5 세트가 부분집합인지 확인

<은 현재 세트가 다른 세트의 진부분집합(proper subset)인지 확인하며 메서드는 없습니다. 다음은 세트 {1, 2, 3, 4}{1, 2, 3, 4, 5}의 진부분집합이므로 참입니다. 즉, 부분집합이지만 같지는 않을 때 참입니다.

  • 현재세트 < 다른세트
>>> a = {1, 2, 3, 4}
>>> a < {1, 2, 3, 4, 5}
True
그림 26-6 세트가 진부분집합인지 확인

>=은 현재 세트가 다른 세트의 상위집합(superset)인지 확인하며 issuperset 메서드와 같습니다. 다음은 세트 {1, 2, 3, 4}{1, 2, 3, 4}의 상위집합이므로 참입니다(등호가 있으므로 두 세트가 같을 때도 참입니다).

  • 현재세트 >= 다른세트
  • 현재세트.issuperset(다른세트)
>>> a = {1, 2, 3, 4}
>>> a >= {1, 2, 3, 4}
True
>>> a.issuperset({1, 2, 3, 4})
True
그림 26-7 세트가 상위집합인지 확인

>은 현재 세트가 다른 세트의 진상위집합(proper superset)인지 확인하며 메서드는 없습니다. 다음은 세트 {1, 2, 3, 4}{1, 2, 3}의 진상위집합이므로 참입니다. 즉, 상위집합이지만 같지는 않을 때 참입니다.

  • 현재세트 > 다른세트
>>> a = {1, 2, 3, 4}
>>> a > {1, 2, 3}
True
그림 26-8 세트가 진상위집합인지 확인

26.2.3  세트가 같은지 다른지 확인하기

세트는 == 연산자를 사용하여 서로 같은지 확인할 수 있습니다.

>>> a = {1, 2, 3, 4}
>>> a == {1, 2, 3, 4}
True
>>> a == {4, 2, 1, 3}
True

세트는 요소의 순서가 정해져 있지 않으므로 ==로 비교했을 때 각 요소만 같으면 참입니다.

!= 연산자는 세트가 다른지 확인합니다.

>>> a = {1, 2, 3, 4}
>>> a != {1, 2, 3}
True

26.2.4  세트가 겹치지 않는지 확인하기

disjoint는 현재 세트가 다른 세트와 겹치지 않는지 확인합니다. 겹치는 요소가 없으면 True, 있으면 False입니다.

  • 현재세트.isdisjoint(다른세트)
>>> a = {1, 2, 3, 4}
>>> a.isdisjoint({5, 6, 7, 8})       # 겹치는 요소가 없음
True
>>> a.isdisjoint({3, 4, 5, 6})    # a와 3, 4가 겹침
False