개요
2023.10.10 - [Python] Counter - 데이터 수 확인에서 Counter 클래스에 대해 알아보았고, 2023.10.25 - [Python] 다중집합 교집합/합집합 구현에서 Python으로 중복집합의 교집합, 합집합 연산을 구현해 봤다. 근데 공식 문서를 보니 Counter 클래스가 다른 프로그래밍 언어의 multiset과 유사하다고 한다.
생각해 보면 중복집합 \(\{a, a, a, b, b, c, c, c, c\}\)는 \((\{a, b, c\}, (a \mapsto 3, b \mapsto 2, c \mapsto 4))\)로도 표현할 수 있는데, 이는 원소를 Key로 하고 중복도를 Value로 하는 딕셔너리로 생각할 수 있다. 그래서인지 Counter 클래스는 중복집합을 생성하기 위한 몇 가지 수학 연산을 제공하는데, 이 글에서는 Counter 클래스를 이용한 다중집합 연산에 대해 정리해보려고 한다.
참고로 Counter 클래스는 값이 양수인 경우에만 중복집합으로 취급할 수 있다. Counter 클래스 값 자체는 0이나 음수도 될 수 있다.
교집합
아래와 같은 중복집합 A, B가 있다고 할 때,
a = [1, 2, 2, 3, 4, 5]
b = [1, 1, 2, 3, 4, 6]
두 중복집합 A, B의 교집합은 [1, 2, 3, 4]가 된다.
중복집합 A, B의 교집합은 연산자 &를 사용하여 구할 수 있다.
from collections import Counter
a = Counter([1, 2, 2, 3, 4, 5])
b = Counter([1, 1, 2, 3, 4, 6])
a & b
합집합
마찬가지로 중복집합 A, B가 있다고 할 때,
a = [1, 2, 2, 3, 4, 5]
b = [1, 1, 2, 3, 4, 6]
두 중복집합 A, B의 합집합은 [1, 1, 2, 2, 3, 4, 5, 6]가 된다.
중복집합 A, B의 합집합은 연산자 |를 사용하여 구할 수 있다.
from collections import Counter
a = Counter([1, 2, 2, 3, 4, 5])
b = Counter([1, 1, 2, 3, 4, 6])
a | b
차집합
중복집합 A, B가 있다고 할 때,
a = [1, 2, 2, 3, 4, 5]
b = [1, 1, 2, 3, 4, 6]
두 중복집합 A에 대한 B의 차집합은 [2, 5]가 된다. 사진은 생략한다. Counter 객체는 뺄셈 연산을 통해 차집합을 구할 수 있다.
from collections import Counter
a = Counter([1, 2, 2, 3, 4, 5])
b = Counter([1, 1, 2, 3, 4, 6])
a - b
b - a
반대로 B에 대한 A의 차집합은 [1, 6]이 된다.
참고 문서
https://docs.python.org/ko/3/library/collections.html#collections.Counter