데이터 분석/python
set
fullfish
2025. 10. 24. 14:08
set은 “중복 없는 원소들의 모음”을 해시 기반으로 매우 빠르게 관리하는 가변(collection) 타입이야. 원소의 존재 여부 체크, 합집합·교집합 같은 집합 연산을 고속으로 처리
기본 성질
중복 없음: 같은 값은 하나만 보관
• 순서 없음: 인덱스로 접근 불가(삽입 순서를 믿으면 안 됨)
• 변경 가능(mutable): add, remove 등으로 수정 가능
• 원소는 해시 가능해야 함: 불변(immutable)·hashable 타입만 원소로 가능
– 가능: int, str, bool, tuple(내부도 해시 가능해야), frozenset
– 불가: list, dict, set 등 가변 타입
• 평균 시간복잡도
– membership 체크 x in s: 평균 O(1)
– 추가/삭제 add, remove: 평균 O(1)
– 합·교·차 같은 집합 연산: 원소 수에 선형적으로 비례
기본 사용
s = set() # 빈 집합
s = {1, 2, 3} # 리터럴
s.add(4) # {1,2,3,4}
s.update([4,5,6]) # 여러 개 추가
s.discard(10) # 없으면 조용히 무시
s.remove(3) # 없으면 KeyError
x = s.pop() # 아무 원소 하나 꺼내고 제거
len(s) # 원소 개수
연산자와 메서드
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# 교집합 (intersection)
print(a & b) # {3, 4}
print(a.intersection(b)) # {3, 4}
# 합집합 (union)
print(a | b) # {1, 2, 3, 4, 5, 6}
print(a.union(b)) # {1, 2, 3, 4, 5, 6}
# 차집합 (difference)
print(a - b) # {1, 2}
print(a.difference(b)) # {1, 2}
# 대칭차집합 (symmetric difference)
print(a ^ b) # {1, 2, 5, 6}
print(a.symmetric_difference(b))# {1, 2, 5, 6}
# 부분집합 (subset)
print(a <= b) # False (a가 b의 부분집합이 아님)
print({1,2} <= a) # True ({1,2}는 a의 부분집합)
print({1,2} < a) # True (진부분집합)
# 상위집합 (superset)
print(a >= {1,2}) # True (a가 {1,2}의 상위집합)
# 서로소 여부 (disjoint)
print(a.isdisjoint({7,8})) # True (공통 원소 없음)
print(a.isdisjoint(b)) # False (3,4 겹침)
# 제자리 갱신 (in-place update)
c = {1, 2, 3}
d = {3, 4, 5}
c &= d # 교집합 갱신 → c는 {3}
print(c)
c = {1, 2, 3}
c |= d # 합집합 갱신 → c는 {1,2,3,4,5}
print(c)
c = {1, 2, 3, 4}
c -= d # 차집합 갱신 → c는 {1,2}
print(c)
c = {1, 2, 3}
c ^= d # 대칭차집합 갱신 → c는 {1,2,4,5}
print(c)
# 메서드 방식도 동일한 동작
a = {1, 2, 3, 4}
b = {3, 4, 5}
a.intersection_update(b) # a = {3, 4}
a.update({10, 11}) # a = {3, 4, 10, 11}
a.difference_update({4, 11}) # a = {3, 10}
a.symmetric_difference_update({10, 99}) # a = {3, 99}
print(a)