한양과학기술고등학교

에듀테크 프로젝트 대시보드

세트 (set / frozenset)

set frozenset union intersection dedup

중복 없는 순서 없는 컬렉션. 멤버십 검사와 집합 연산이 빠릅니다(O(1) 평균).

1. 생성

s = {1, 2, 3}
s = set([1, 1, 2, 3])     # => {1, 2, 3}  (중복 자동 제거)
empty = set()             # {} 는 빈 딕셔너리!

# 원소는 해시 가능해야 함 (list 불가, tuple 가능)
ok = {(1, 2), "a", 3}
# bad = {[1, 2]}          # TypeError: unhashable type: 'list' 

2. 추가·삭제

s = {1, 2, 3}
s.add(4)
s.discard(9)     # 없어도 조용히 넘어감
s.remove(2)      # 없으면 KeyError
x = s.pop()      # 임의 원소 제거
s.clear()

3. 집합 연산

연산자메서드의미
a | ba.union(b)합집합
a & ba.intersection(b)교집합
a - ba.difference(b)차집합
a ^ ba.symmetric_difference(b)대칭 차집합
a <= ba.issubset(b)부분집합 여부
a >= ba.issuperset(b)상위집합 여부
a, b = {1, 2, 3}, {2, 3, 4}
a | b     # => {1, 2, 3, 4}
a & b     # => {2, 3}
a - b     # => {1}
a ^ b     # => {1, 4}
a.isdisjoint({9})   # => True  (겹치는 원소 없음)

4. 대표 용도 — 중복 제거

nums = [3, 1, 2, 3, 1]
unique = list(set(nums))          # 순서 보장 안 됨
unique = list(dict.fromkeys(nums))  # 순서 유지하며 중복 제거 => [3, 1, 2]

# 빠른 멤버십 검사
allowed = {"GET", "POST", "PUT"}
if method in allowed:              # O(1) — 리스트면 O(n)
    ...

5. frozenset

fs = frozenset([1, 2, 3])
# fs.add(4)                # AttributeError — 불변

# 불변이라 dict 키·다른 set 의 원소가 될 수 있음
graph = {frozenset({"A", "B"}): 5}
seen = {frozenset({1, 2}), frozenset({3, 4})}

6. 세트 컴프리헨션

{c.lower() for c in "Hello World" if c.isalpha()}
# => {'h', 'e', 'l', 'o', 'w', 'r', 'd'}

lengths = {len(w) for w in ["a", "bb", "cc", "ddd"]}
# => {1, 2, 3}
"지금 하는 것이 아예 안 하는 것보다 낫다 — 다만 '지금 당장'보다는 낫지 않을 때가 많다"