에듀테크 프로젝트 대시보드
세트 (set / frozenset)
중복 없는 순서 없는 컬렉션. 멤버십 검사와 집합 연산이 빠릅니다(O(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' s = {1, 2, 3}
s.add(4)
s.discard(9) # 없어도 조용히 넘어감
s.remove(2) # 없으면 KeyError
x = s.pop() # 임의 원소 제거
s.clear()| 연산자 | 메서드 | 의미 |
|---|---|---|
a | b | a.union(b) | 합집합 |
a & b | a.intersection(b) | 교집합 |
a - b | a.difference(b) | 차집합 |
a ^ b | a.symmetric_difference(b) | 대칭 차집합 |
a <= b | a.issubset(b) | 부분집합 여부 |
a >= b | a.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 (겹치는 원소 없음)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)
...fs = frozenset([1, 2, 3])
# fs.add(4) # AttributeError — 불변
# 불변이라 dict 키·다른 set 의 원소가 될 수 있음
graph = {frozenset({"A", "B"}): 5}
seen = {frozenset({1, 2}), frozenset({3, 4})}{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}