파이썬의 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': []})'python' 카테고리의 다른 글
| Ruff 소개 및 활용, Python 코드 품질 관리 (0) | 2025.04.02 |
|---|---|
| FastAPI에서 UploadFile 타입 검증 시 isinstance()가 동작하지 않는 문제 (0) | 2025.03.31 |
| pip으로 Poetry 설치하고 설정하는 가이드 (3) | 2024.11.20 |
| use-implicit-booleaness-not-comparison: Pythonic 코드 작성법 (1) | 2024.11.12 |
| Fastapi 애플리케이션 로깅 : YAML 설정으로 로깅 구성하는 법(timestamp 추가) (5) | 2024.10.31 |