Python

[Python] Counter - 중복집합 연산

비번변경 2023. 10. 26. 15:19

 

 

 

개요

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

 

 

728x90