개요
2023.10.10 - [Python] Counter - 데이터 수 확인에서 Counter 클래스에 대해 알아보았고, 2023.10.25 - [Python] 다중집합 교집합/합집합 구현에서 Python으로 중복집합의 교집합, 합집합 연산을 구현해 봤다. 근데 공식 문서를 보니 Counter 클래스가 다른 프로그래밍 언어의 multiset과 유사하다고 한다.
생각해 보면 중복집합
참고로 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