Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 집합(Set) 연산 완벽 가이드 – 합집합, 교집합, 차집합부터 주요 메서드까지

수학에서 집합(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()

이처럼 파이썬의 집합은 수학적 집합 연산을 직관적인 메서드와 연산자로 손쉽게 수행할 수 있는 강력한 자료형입니다. 특히 중복 제거, 빠른 멤버십 검사, 집합 간 관계 분석이 필요할 때 유용하게 활용할 수 있습니다.