본문 바로가기
Python 코딩도장

파이썬 코딩도장 Unit 26 정리(2) - 집합 연산

by chanfficial 2022. 2. 8.

2. 집합 연산 사용하기

  • 집합 연산은 파이썬의 산술 연산자와 논리 연산자를 활용한다.
  • | 연산자는 합집합( union)을 구하며 OR 연산자 | 를 사용하고 set.union 메서드와 동작이 같다.
    세트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}​
    - 세트 {1, 2, 3, 4}와 {3, 4, 5, 6}의 합집합을 구하므로 {1, 2, 3, 4, 5, 6}이 나온다.
  • & 연산자는 교집합(intersection)을 구하며 AND 연산자 & 를 사용하고 set.intersection 메서드와 동작이 같다.
    세트1 & 세트2
    set.intersection(세트1, 세트2)​
    >>> a = {1, 2, 3, 4}
    >>> b = {3, 4, 5, 6}
    >>> a & b
    {3, 4}
    >>> set.intersection(a, b)
    {3, 4}​
    - 세트 {1, 2, 3, 4}와 {3, 4, 5, 6} 중에서 교집합을 구하므로 {3, 4}가 나온다.
  • - 연산자는 차집합(difference)을 구하며 뺄셈 연산자 - 를 사용하고 set.difference 메서드와 동작이 같다.
    세트1 - 세트2
    set.difference(세트1, 세트2)​
    >>> a - b
    {1, 2}
    >>> set.difference(a, b)
    {1, 2}​
    - 세트 {1, 2, 3, 4}에서 세트 {3, 4, 5, 6}와 겹치는 부분을 뺐으므로 {1, 2}가 나온다.
  • ^ 연산자는 대칭차집합(symmetric difference)을 구하며 XOR 연산자 ^ 를 사용하고 set.symmetric_difference 메서드와 동작이 같다.
  • 대칭차집합은 XOR 연산자의 특성을 그대로 따르는데 XOR은 서로 다르면 참이기 때문에, 집합에서는 두 집합 중 겹치지 않는 요소만 포함한다.
    세트1 ^ 세트2
    set.symmetric_difference(세트1, 세트2)​
    >>> a = {1, 2, 3, 4}
    >>> b = {3, 4, 5, 6}
    >>> a ^ b
    {1, 2, 5, 6}
    >>> set.symmetric_difference(a, b)
    {1, 2, 5, 6}​
    - 세트 {1, 2, 3, 4}와 {3, 4, 5, 6}의 대칭차집합을 구하므로 같은 값인 3과 4를 제외한 {1, 2, 5, 6}이 나온다.

 

2-1. 집합 연산 후 할당 연산자 사용하기

  • 세트 자료형에 |, &, -, ^ 연산자와 할당 연산자 = 을 함께 사용하면 집합 연산의 결과를 다시 변수에 저장(할당)한다.
  • |= 은 현재 세트에 다른 세트를 더하며 update 메서드와 같다.
    세트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}​
    - 세트 {1, 2, 3, 4}에 {5}를 더하므로 {1, 2, 3, 4, 5}가 나온다.
  • &= 은 현재 세트와 다른 세트 중에서 겹치는 요소만 현재 세트에 저장하고 intersection_update 메서드와 같다.
    세트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}​
    - 세트 a와 {0, 1, 2, 3, 4}중에서 겹치는 요소만 a에 저장하므로 {1, 2, 3, 4}가 나온다.
  • -= 은 현재 세트에서 다른 세트를 뺴며 difference_update 메서드와 같다.
    세트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}​
    - 세트 a에서 3을 빼므로 {1, 2, 4}가 나온다.
  • ^= 은 현재 세트와 다른 세트 중에서 겹치지 않는 요소만 현재 세트에 저장하며 symmetric_difference_update 메서드와 같다.
    세트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}​
    - 세트 a와 {3, 4, 5, 6}중에서 겹치지 않는 요소만 a에 저장하므로 {1, 2, 5, 6}이 된다.

 

2-2. 부분 집합과 상위집합 확인하기

  • 세트는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 표현할 수도 있다.
  • 현재 세트가 다른 세트의 (진)부분집합 또는 (진)상위집합인지 확인할 때는 세트 자료형에 부등호와 등호를 사용한다.
  • <= 은 현재 세트가 다른 세트의 부분집합(subset)인지 확인하며 issubset 메서드와 같다.
    현재세트 <= 다른세트
    현재세트.issubset(다른세트)​
    >>> a = {1, 2, 3, 4}
    >>> a <= {1, 2, 3, 4}
    True
    >>> a.issubset({1, 2, 3, 4, 5})
    True​
    - 세트 a가 {1, 2 3, 4}의 부분집합이므로 참이다.
  • < 은 현재 세트가 다른 세트의 진부분집합(proper subset)인지 확인하며 메서드는 없다.
    현재세트 < 다른세트​
    >>> a = {1, 2, 3, 4}
    >>> a < {1, 2, 3, 4, 5}
    True​
    - 세트 a가 {1, 2, 3, 4, 5}의 진부분집합이므로 참이다. 즉, 부분집합이지만 같지는 않을 때 참이다
  • >= 은 현재 세트가 다른 세트의 상위집합(superset)인지 확인하며 issuperset 메서드와 같다.
    현재세트 >= 다른세트
    현재세트.issuperset(다른세트)​
    >>> a = {1, 2, 3, 4}
    >>> a >= {1, 2, 3, 4}
    True
    >>> a.issuperset({1, 2, 3, 4})
    True​
    - 세트 a가 {1, 2, 3, 4}의 상위집합이므로 참이다.
  • > 은 현재 세트가 다른 세트의 진상위집합(proper superset)인지 확인하며 메서드는 없다.
    현재세트 > 다른세트​
    >>> a = {1, 2, 3, 4}
    >>> a > {1, 2, 3}
    True​
    - 세트 a가 {1, 2, 3}의 진상위집합이므로 참이다. 즉, 상위집합이지만 같지는 않을 때 참이다.

 

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​

 

 

 

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​