
파이썬 딕셔너리와 집합 차이는 초보자가 아주 자주 헷갈리는 주제입니다. 특히 둘 다 중괄호를 쓰는 장면 때문에 더 헷갈립니다. 하지만 dict는 키로 값을 찾는 저장소이고, set은 중복 없는 원소 묶음이라는 기준으로 보면 훨씬 깔끔하게 정리됩니다.
이번 글에서는 문법 차이를 짧게 정리한 뒤, in 연산, 중복 처리, 빈 중괄호와 set() 차이, 실전 예시까지 연결해서 언제 dict가 자연스럽고 언제 set이 자연스러운지 쉽게 설명하겠습니다.
파이썬 딕셔너리와 집합 차이
먼저 감각부터 잡으면 쉽습니다. dict는 이 키에 대응하는 값이 뭐지?를 푸는 도구이고, set은 이 원소가 있나? 중복 없이 모아야 하나?를 다루는 도구입니다.

학생 이름과 점수 저장은 dict, 방문한 사용자 ID 모으기나 중복 태그 제거는 set이 잘 맞습니다. 즉, 핵심은 값을 짝으로 저장하느냐, 원소 자체만 모으느냐입니다.
딕셔너리
딕셔너리는 키와 값을 짝으로 묶는 자료형입니다. 쉽게 말하면 이름표를 붙여서 값을 꺼내는 저장소에 가깝습니다.
scores = {
"민수": 90,
"지연": 85,
"현우": 95,
}
print(scores["지연"]) # 85여기서 중요한 것은 "지연"이라는 키로 85라는 값을 찾는다는 점입니다. 리스트처럼 위치를 보는 것이 아니라, 이 키에 연결된 값이 무엇인지를 보는 구조입니다.
- 이름으로 전화번호를 찾을 때
- 상품 코드로 가격을 찾을 때
- 사용자 ID로 사용자 정보를 찾을 때
- 설정 이름으로 설정값을 저장할 때
즉, 찾는 기준이 되는 이름표가 있으면 dict가 잘 맞습니다.
집합
집합은 키와 값을 짝으로 저장하지 않습니다. 그 대신 중복 없는 원소 묶음을 다룹니다.
visited_users = {"u100", "u200", "u100", "u300"}
print(visited_users) # {'u100', 'u200', 'u300'}같은 값이 여러 번 들어와도 집합에는 한 번만 남습니다. 그래서 집합은 이미 본 값인지 확인하거나, 중복을 없애거나, 두 그룹의 공통값을 비교할 때 아주 자연스럽습니다.
tags = ["python", "dict", "python", "set", "set"]
unique_tags = set(tags)
print(unique_tags)즉, 원소 하나하나의 존재 여부와 중복 제거가 중요하면 set이 잘 맞습니다.
in 연산
초보자가 가장 많이 헷갈리는 부분 중 하나가 바로 in입니다. dict와 set 모두 in을 쓸 수 있지만, 검사 대상이 다릅니다.
dict에서 in
딕셔너리에서 in은 키가 있는지를 검사합니다. 값이 있는지를 검사하는 것이 아닙니다.
prices = {
"apple": 1200,
"banana": 1500,
}
print("apple" in prices) # True
print(1200 in prices) # False1200은 값으로 들어 있지만 키는 아니기 때문에 False가 나옵니다. 이 지점에서 처음 많이 헷갈립니다.
set에서 in
집합에서 in은 원소가 있는지를 검사합니다. 집합은 키-값 구조가 아니므로 훨씬 직관적입니다.
blocked_words = {"spam", "ad", "clickbait"}
print("spam" in blocked_words) # True
print("sale" in blocked_words) # False그래서 membership 검사 자체가 목적이라면, set이 더 또렷하게 읽히는 경우가 많습니다. 같은 in 연산이라도 dict는 키 검사, set은 원소 검사입니다.
중복
집합은 같은 원소를 여러 번 넣어도 하나만 남습니다. 이건 집합의 핵심 성질입니다.
numbers = {1, 1, 2, 2, 3}
print(numbers) # {1, 2, 3}반면 딕셔너리는 같은 키를 여러 번 둘 수 없습니다. 같은 키가 다시 나오면 마지막 값으로 덮어써집니다.
user = {
"name": "민수",
"name": "지연",
}
print(user) # {'name': '지연'}- set은 원소의 중복을 허용하지 않는다
- dict는 키가 겹치면 같은 항목을 다시 설정하는 느낌이다
- 중복 제거가 목적이면 보통 set을 먼저 떠올리는 편이 맞다
중괄호
둘 다 중괄호를 쓰기 때문에 문법이 헷갈릴 수 있습니다. 하지만 규칙은 생각보다 단순합니다.
값 쌍
student = {"name": "민수", "age": 20}중괄호 안에 key: value 형태가 보이면 딕셔너리입니다.
값 나열
colors = {"red", "green", "blue"}중괄호 안에 값만 쉼표로 나열하면 집합입니다.
빈 중괄호
empty_dict = {}
empty_set = set()이 부분이 정말 중요합니다. 빈 중괄호 {}는 빈 집합이 아니라 빈 딕셔너리입니다. 빈 집합은 반드시 set()으로 만들어야 합니다.
빈 set을 만들 때는 {}가 아니라 set()을 써야 합니다.
언제 dict를 쓸까
dict가 자연스러운 순간은 찾는 기준과 저장할 값이 분명할 때입니다.
prices = {
"apple": 1200,
"banana": 1500,
"orange": 1800,
}
print(prices["banana"]) # 1500여기서 중요한 것은 banana라는 이름으로 가격을 찾는 일입니다. 이런 상황에서 set은 맞지 않습니다. set은 값 하나의 존재 여부는 볼 수 있어도, 그 값에 연결된 다른 정보를 꺼낼 수는 없기 때문입니다.
- 사용자 ID -> 사용자 정보
- 과목명 -> 점수
- 상품 코드 -> 재고 수량
- 설정 이름 -> 설정값
한마디로 말하면, 무언가를 이름표로 찾아서 다른 값을 꺼내야 하면 dict입니다.
언제 set을 쓸까
set이 자연스러운 순간은 membership 검사와 uniqueness가 핵심일 때입니다.
logged_in_users = {"u100", "u200", "u300"}
if "u200" in logged_in_users:
print("이미 로그인한 사용자입니다.")이 상황에서는 사용자별 부가 정보를 저장하는 것이 아니라, 그 ID가 있는지 없는지가 더 중요합니다.
emails = ["a@test.com", "b@test.com", "a@test.com"]
unique_emails = set(emails)
print(unique_emails)- 이미 본 값인지 확인할 때
- 중복을 없애고 싶을 때
- 허용된 값 목록을 관리할 때
- 두 그룹의 공통값을 비교할 때
즉, 원소 자체의 존재 여부가 핵심이면 set입니다.
같이 쓰기
실전에서는 dict와 set을 같이 쓰는 경우도 많습니다. 이 조합이 오히려 더 자연스럽습니다.
prices = {
"A001": 1200,
"A002": 1800,
"A003": 1500,
}
sold_out = {"A002"}
code = "A002"
if code in sold_out:
print("품절 상품입니다.")
else:
print(prices[code])이 예시를 보면 역할이 아주 선명합니다. prices는 코드로 가격을 찾기 위한 dict이고, sold_out은 품절 여부만 확인하기 위한 set입니다. 즉, 값 찾기와 존재 확인은 서로 다른 문제입니다.
자주 하는 실수
- 전부 dict로만 생각하는 실수
- dict의 in을 값 검사로 오해하는 실수
- 빈 집합을 {}로 만들려는 실수
- set으로 값을 찾아오려는 실수
특히 두 번째와 세 번째는 초반에 정말 자주 나옵니다. 딕셔너리에서 in은 키를 보고, 빈 set은 set()으로 만든다는 점을 먼저 고정해 두면 실수가 많이 줄어듭니다.
기억할 기준
- key -> value 관계가 필요하다 -> dict
- 원소가 있는지 없는지가 중요하다 -> set
- 중복을 없애고 싶다 -> set
- 빈 집합이 필요하다 -> set()
- 둘 다 중괄호를 써도 역할은 전혀 다를 수 있다
이 글을 다 읽고 하나만 남기면 됩니다. dict는 키로 값을 찾는 저장소, set은 중복 없는 원소 묶음입니다. 이 기준만 잡혀도 파이썬 자료형 선택이 훨씬 쉬워집니다.
마무리
파이썬 딕셔너리와 집합 차이는 문법 모양보다 역할 차이로 이해하는 편이 훨씬 오래 갑니다. 딕셔너리는 키로 값을 찾기 위한 도구이고, 집합은 원소의 존재 여부와 중복 없는 묶음을 다루기 위한 도구입니다.
중괄호 때문에 처음에는 비슷해 보여도, 실제로는 푸는 문제가 다릅니다. 관련해서 비교 연산이 헷갈린다면 파이썬 is와 == 차이 글도 같이 읽어보면 좋고, 자료형 선택 감각을 더 넓히고 싶다면 파이썬 리스트와 튜플 차이 글도 이어서 읽어보면 좋습니다. 공식 기준은 Python dict 문서, Python set 문서, Python data structures 튜토리얼을 참고하면 됩니다.