수학에서 집합(set)은 서로 구별되는 객체들의 모임으로, 그 자체를 하나의 객체로 취급하는 개념입니다. 예를 들어 숫자 2, 4, 6을 각각 따로 보면 서로 다른 객체이지만, 이들을 하나로 묶어 생각하면 크기가 3인 하나의 집합 {2, 4, 6}이 됩니다.
집합의 기본 연산
| 연산 | 표기법 | 의미 |
|---|---|---|
| 교집합(Intersection) | A ∩ B | A와 B 양쪽에 모두 속하는 모든 원소 |
| 합집합(Union) | A ∪ B | A 또는 B(혹은 둘 다)에 속하는 모든 원소 |
| 차집합(Difference) | A − B | A에는 속하지만 B에는 속하지 않는 모든 원소 |
| 여집합(Complement) | A′ (또는 Aᶜ) | 전체집합 U 중 A에 속하지 않는 모든 원소 |
파이썬에서 리스트(list) 대신 집합(set)을 사용하는 가장 큰 장점은 특정 원소가 집합에 포함되어 있는지 확인하는 멤버십 검사가 최적화되어 있다는 점입니다. 이는 내부적으로 해시 테이블(hash table) 자료구조를 기반으로 하기 때문에 가능하며, 평균적으로 O(1)의 시간 복잡도로 매우 빠르게 검색할 수 있습니다.
집합의 주요 메서드
add(x) 메서드
집합에 원소 x가 아직 없는 경우 새로 추가합니다. 이미 존재하는 원소라면 집합은 변하지 않습니다.
A = {"AA", "BB", "CC"}
A.add("VV")
위 코드를 실행하면 집합 A에 "VV"가 추가됩니다.
union(s) 메서드
두 집합의 합집합을 반환합니다. 두 집합 사이에 | 연산자를 사용하는 것은 My_Set1.union(My_Set2)을 작성하는 것과 동일합니다.
A = {"AA", "BB", "CC"}
B = {"MM", "NN"}
Z = A.union(B)
# 또는
Z = A | B
결과 집합 Z는 A와 B의 모든 원소를 포함하게 됩니다.
intersection(s) 메서드
두 집합의 교집합을 반환합니다. 이 연산에는 & 연산자를 사용할 수 있습니다.
S = A.intersection(B)
결과 집합 S는 A와 B에 공통으로 존재하는 원소들만 담게 됩니다.
difference(s) 메서드
첫 번째 집합에는 존재하지만 두 번째 집합에는 없는 원소들로 이루어진 차집합을 반환합니다. 여기서는 - 연산자를 사용할 수 있습니다.
W = A.difference(B) # 또는 W = A - B
결과 집합 W는 A에는 있지만 B에는 없는 모든 원소를 포함합니다.
clear() 메서드
집합의 모든 원소를 제거하여 집합 전체를 비웁니다.
B.clear()
위 코드는 집합 B의 모든 원소를 삭제합니다.
집합에서 사용할 수 있는 연산자
파이썬의 set과 frozenset은 다음과 같은 연산자를 지원합니다.
key in s # s에 key가 포함되어 있는지 확인 key not in s # s에 key가 포함되어 있지 않은지 확인 s1 == s2 # s1과 s2가 같은지 비교 s1 != s2 # s1과 s2가 다른지 비교 s1 <= s2 # s1이 s2의 부분집합(subset)인지 확인 s1 < s2 # s1이 s2의 진부분집합(proper subset)인지 확인 s1 >= s2 # s1이 s2의 상위집합(superset)인지 확인 s1 > s2 # s1이 s2의 진상위집합(proper superset)인지 확인 s1 | s2 # s1과 s2의 합집합 s1 & s2 # s1과 s2의 교집합 s1 - s2 # s1에는 있지만 s2에는 없는 원소들의 집합 s1 ^ s2 # s1 또는 s2 중 정확히 한쪽에만 있는 원소들의 집합(대칭 차집합)
예제 코드
# 파이썬 집합(Set)의 동작을 보여주는 프로그램
# 두 개의 집합 생성
My_Set1 = set()
My_Set2 = set()
# My_Set1에 원소 추가
for i in range(1, 6):
My_Set1.add(i)
# My_Set2에 원소 추가
for i in range(3, 8):
My_Set2.add(i)
print("My_Set1 = ", My_Set1)
print("My_Set2 = ", My_Set2)
print("\n")
# My_Set1과 My_Set2의 합집합
My_Set3 = My_Set1 | My_Set2 # My_Set1.union(My_Set2)과 동일
print("My_Set1과 My_Set2의 합집합: My_Set3 = ", My_Set3)
# My_Set1과 My_Set2의 교집합
My_Set4 = My_Set1 & My_Set2 # My_Set1.intersection(My_Set2)과 동일
print("My_Set1과 My_Set2의 교집합: My_Set4 = ", My_Set4)
print("\n")
# My_Set3과 My_Set4의 관계 확인
if My_Set3 > My_Set4: # My_Set3.issuperset(My_Set4)과 동일
print("My_Set3은 My_Set4의 상위집합(superset)입니다.")
elif My_Set3 < My_Set4: # My_Set3.issubset(My_Set4)과 동일
print("My_Set3은 My_Set4의 부분집합(subset)입니다.")
else: # My_Set3 == My_Set4
print("My_Set3과 My_Set4는 같은 집합입니다.")
# My_Set4와 My_Set3의 관계 출력
if My_Set4 < My_Set3: # My_Set4.issubset(My_Set3)과 동일
print("My_Set4는 My_Set3의 부분집합(subset)입니다.")
print("\n")
# My_Set3과 My_Set4의 차집합
My_Set5 = My_Set3 - My_Set4
print("My_Set3에는 있고 My_Set4에는 없는 원소: My_Set5 = ", My_Set5)
print("\n")
# My_Set4와 My_Set5가 서로소(disjoint) 집합인지 확인
if My_Set4.isdisjoint(My_Set5):
print("My_Set4와 My_Set5는 공통 원소가 없습니다.\n")
# My_Set5의 모든 원소 제거
My_Set5.clear()
print("clear() 적용 후 My_Set5:")
print("My_Set5 = ", My_Set5)
실행 결과
My_Set1 = {1, 2, 3, 4, 5}
My_Set2 = {3, 4, 5, 6, 7}
My_Set1과 My_Set2의 합집합: My_Set3 = {1, 2, 3, 4, 5, 6, 7}
My_Set1과 My_Set2의 교집합: My_Set4 = {3, 4, 5}
My_Set3은 My_Set4의 상위집합(superset)입니다.
My_Set4는 My_Set3의 부분집합(subset)입니다.
My_Set3에는 있고 My_Set4에는 없는 원소: My_Set5 = {1, 2, 6, 7}
My_Set4와 My_Set5는 공통 원소가 없습니다.
clear() 적용 후 My_Set5:
My_Set5 = set()
이처럼 파이썬의 집합은 수학적 집합 연산을 직관적인 메서드와 연산자로 손쉽게 수행할 수 있는 강력한 자료형입니다. 특히 중복 제거, 빠른 멤버십 검사, 집합 간 관계 분석이 필요할 때 유용하게 활용할 수 있습니다.