C
Python/입문/Lesson 08

set — 중복 없는 집합

15분·theory
이 챕터
7/7

set — 중복 없는 집합

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ set 으로 중복 제거 + 집합 연산 (& | -)
  • ✅ list ↔ set 변환 시점
  • ✅ hashable 조건 (set/dict key)

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

set 8가지 패턴 — 코드 + 실행 결과

set = 순서 X · 중복 X · 해시 기반. 멤버십 검사 O(1) — list 보다 100배 빠름. 수학의 집합 연산 그대로.


1. 만들기

python
숫자들 = {1, 2, 3, 4, 5}              # 중괄호 + 값
이름들 = {"홍길동", "이몽룡"}

# list → set (중복 자동 제거)
중복있음 = [1, 2, 2, 3, 3, 3]
중복없음 = set(중복있음)
print(중복없음)                       # {1, 2, 3}

# ⚠️ 빈 set 은 {} 가 아님 (그건 dict)
빈_set = set()                        # ← 이렇게
빈_dict = {}                          # 이건 dict

2. 추가·삭제

python
s = {1, 2, 3}

s.add(4)                # {1, 2, 3, 4}
s.add(2)                # 이미 있음 → 무시 (에러 X)

s.remove(3)             # {1, 2, 4}
# s.remove(99)          # KeyError — 없으면 에러

s.discard(99)           # 없어도 에러 X (안전)

꺼낸_값 = s.pop()        # 임의의 원소 제거 + 반환

add / remove / discard / pop — list 와 비슷하지만 순서 X.


3. in — O(1) 멤버십 검사 (set 의 진가)

python
큰_list = list(range(1_000_000))
큰_set  = set(range(1_000_000))

# list 검색 — O(n), 100만 검사 시 약 0.5초
print(999_999 in 큰_list)

# set 검색 — O(1), 즉시 (마이크로초)
print(999_999 in 큰_set)

"이 값이 안에 있나?" 를 자주 검사 하면 무조건 set.


4. 집합 연산 — 수학 그대로

python
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}

# 합집합 (둘 중 하나라도 있는)
print(A | B)            # {1, 2, 3, 4, 5, 6}
print(A.union(B))       # 같은 결과

# 교집합 (둘 다 있는)
print(A & B)            # {3, 4}
print(A.intersection(B))

# 차집합 (A 에는 있고 B 에는 없는)
print(A - B)            # {1, 2}

# 대칭차 (한쪽에만 있는)
print(A ^ B)            # {1, 2, 5, 6}

5. 부분집합·상위집합

python
작은 = {1, 2}
큰   = {1, 2, 3, 4}

print(작은 <= 큰)        # True (작은 ⊆ 큰)
print(작은 < 큰)         # True (진부분)
print(큰 >= 작은)        # True

# 겹치는 원소 X 확인
A = {1, 2, 3}
B = {4, 5, 6}
print(A.isdisjoint(B))   # True

6. set comprehension

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

# 짝수 제곱
짝수_제곱 = {x*x for x in range(10) if x % 2 == 0}
print(짝수_제곱)             # {0, 4, 16, 36, 64}

7. 실용 패턴 — 중복 제거

python
# 리스트에서 중복 제거 (순서 보존 X)
데이터 = [1, 2, 2, 3, 3, 3, 4, 1]
고유 = list(set(데이터))
print(고유)                  # [1, 2, 3, 4]  (순서 무관)

# 두 list 의 공통 원소
A_있음 = [1, 2, 3, 4, 5]
B_있음 = [3, 4, 5, 6, 7]
공통 = list(set(A_있음) & set(B_있음))
print(공통)                  # [3, 4, 5]

# 한 글자만 있는지 검사
필요_글자 = set("abcde")
입력 = "alphabet"
있는_것 = 필요_글자 & set(입력)
print(있는_것)               # {'a', 'b', 'e'}

8. frozenset — 불변 set

python
fs = frozenset([1, 2, 3])

# fs.add(4)              # AttributeError — 변경 불가

# 진가 — dict key·set 원소 가능
경로_캐시 = {
    frozenset(["A", "B"]): "직선",
    frozenset(["A", "B", "C"]): "삼각형",
}
print(경로_캐시[frozenset(["B", "A"])])    # 직선 (순서 무관)

일반 set 은 dict 키로 못 쓰지만 frozenset 은 변경 불가 라 가능.


list vs set vs dict — 언제 무엇을

listsetdict
순서✅ (3.7+)
중복key X (value O)
검색O(n)O(1)O(1)
인덱싱[0]["key"]
사용처순서 있는 데이터멤버십·중복 제거이름→값 매핑

한 줄 요약

작업코드
만들기{1, 2, 3} 또는 set()
추가s.add(x)
삭제s.discard(x) (안전)
확인x in s (O(1))
합집합A \B
교집합A & B
중복 제거list(set(lst))

🐍 실행해보기 — set — 직접 실행

위 개념을 실제로 코드로 실행해보세요. 값을 바꿔가며 어떻게 동작하는지 직접 확인하는 게 가장 빠른 학습.
✏️ Python 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
🐍 Pyodide로 실제 Python 실행 — 첫 실행 시 로딩 3~5초 소요

🤖 AI 에게 이렇게 요청해보세요

이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.

  • "이 list 중복 제거를 set 으로 바꿔줘"
  • "이 dict 병합을 dict | dict (Python 3.9+) 로 바꿔줘"

왜 이게 토큰을 줄이나

개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.

먼저 읽으면 좋은 개념: dict — Key-Value 저장의 표준
set — 중복 없는 집합 - Python