본문 바로가기
python

defaultdict(dict): 존재하지 않는 키에도 안전하게 값 추가하는 법

by 니나노뭉 2025. 11. 12.

파이썬의 defaultdict 는 collections 모듈에 포함된 매우 유용한 자료형입니다.
기본적으로 dict(딕셔너리)를 확장한 형태로, 존재하지 않는 키에 접근할 때 자동으로 기본값을 생성해주는 기능을 제공합니다.

 

🔹 기본 개념

일반적인 dict에서 존재하지 않는 키를 조회하면 KeyError가 발생합니다.

d = {}
print(d['a'])  # KeyError 발생!

하지만 defaultdict를 사용하면, 미리 지정한 기본값 생성 함수(factory) 에 따라 새로운 키의 기본값이 자동으로 생성됩니다.


🔹 기본 사용법

from collections import defaultdict

# int를 기본값 생성 함수로 사용
d = defaultdict(int)

여기서 int는 int() 즉 0을 반환하는 함수입니다.
따라서 새로운 키에 접근하면 자동으로 0이 생성됩니다.

🔹 다양한 기본값 예시

 
기본값 함수 생성되는 기본값 설명
int 0 숫자 세기 등에 유용
list [] 리스트 누적에 유용
set set() 중복 없는 집합 저장에 유용
float 0.0 실수 계산 시
lambda: <값> 임의의 기본값 직접 정의 가능

 

예제 1: 리스트 누적

from collections import defaultdict

d = defaultdict(list)
d['fruits'].append('apple')
d['fruits'].append('banana')

print(d)
# 출력: defaultdict(<class 'list'>, {'fruits': ['apple', 'banana']})

 

예제 2: 단어 개수 세기

from collections import defaultdict

text = "apple banana apple grape banana apple"
counter = defaultdict(int)

for word in text.split():
    counter[word] += 1

print(counter)
# 출력: defaultdict(<class 'int'>, {'apple': 3, 'banana': 2, 'grape': 1})

 

🔹 다중 계층 데이터 저장 예시

defaultdict(dict)는 흔히 2단계 딕셔너리 구조를 만들 때 사용됩니다.

from collections import defaultdict

users = defaultdict(dict)

users['kim']['age'] = 30
users['kim']['city'] = 'Seoul'
users['lee']['age'] = 25
users['lee']['city'] = 'Busan'

print(users)
# defaultdict(<class 'dict'>, {
#     'kim': {'age': 30, 'city': 'Seoul'},
#     'lee': {'age': 25, 'city': 'Busan'}
# })

🔹 중첩된 defaultdict (한 단계 더 자동화)

만약 users['kim']['profile']['age'] 처럼 3단계 이상 중첩 딕셔너리를 다뤄야 한다면
defaultdict(dict)만으로는 부족합니다.
(두 번째 단계인 'profile'에서 또 KeyError가 날 수 있음)

그럴 땐 이렇게 중첩 defaultdict를 정의합니다 👇

from collections import defaultdict

nested_dict = lambda: defaultdict(dict)
users = defaultdict(nested_dict)

users['kim']['profile']['age'] = 30
users['kim']['profile']['city'] = 'Seoul'

print(users)
# defaultdict(<function <lambda> at 0x...>, {
#     'kim': defaultdict(<class 'dict'>, {'profile': {'age': 30, 'city': 'Seoul'}})
# })

 

⚠️ 주의할 점

defaultdict는 존재하지 않는 키에 접근하는 순간 새 키를 생성합니다.

d = defaultdict(list)
print(d['x'])  # [] 반환, 그리고 'x'가 실제로 생성됨
print(d)       # defaultdict(<class 'list'>, {'x': []})