728x90
반응형
defaultdict는 Python의 collections 모듈에 포함된 특별한 딕셔너리 자료구조입니다. 기본적으로 키가 없을 때도 기본값을 자동으로 생성할 수 있는 딕셔너리입니다.
일반적인 딕셔너리(dict)는 존재하지 않는 키를 접근하려고 하면 KeyError를 발생시키지만, defaultdict는 미리 지정된 기본값 생성 함수(default_factory)를 사용해 값을 자동으로 생성합니다.
기본 문법
from collections import defaultdict
# defaultdict 생성
d = defaultdict(default_factory)
- default_factory: 기본값을 생성하는 함수(예: int, list, str 등).
- 딕셔너리에 존재하지 않는 키에 접근하면 default_factory를 호출해 기본값을 생성.
예제
1. 기본값을 int로 설정
from collections import defaultdict
d = defaultdict(int) # 기본값을 0으로 설정
print(d["a"]) # "a" 키가 없으므로 기본값 0을 반환
d["a"] += 1
print(d["a"]) # 이제 "a"는 1
출력:
0
1
2. 기본값을 list로 설정
from collections import defaultdict
d = defaultdict(list) # 기본값을 빈 리스트로 설정
d["a"].append(1)
d["a"].append(2)
print(d["a"]) # [1, 2]
print(d["b"]) # 빈 리스트 [] 반환
출력:
[1, 2]
[]
3. 기본값을 사용자 정의 함수로 설정
from collections import defaultdict
def default_value():
return "default"
d = defaultdict(default_value)
print(d["a"]) # 키 "a"가 없으므로 "default" 반환
print(d["b"]) # 키 "b"도 없으므로 "default" 반환
출력:
default
default
defaultdict vs 일반 dict
1. 일반 딕셔너리 사용
d = {}
d["a"] += 1 # KeyError 발생 (키 "a"가 없기 때문)
2. defaultdict 사용
from collections import defaultdict
d = defaultdict(int)
d["a"] += 1 # 기본값 0을 생성한 뒤, 1 증가
print(d["a"]) # 1
활용 사례
1. 문자열에서 각 문자의 빈도수 계산
from collections import defaultdict
s = "hello"
frequency = defaultdict(int)
for char in s:
frequency[char] += 1
print(frequency) # {'h': 1, 'e': 1, 'l': 2, 'o': 1}
2. 그래프 구현
from collections import defaultdict
edges = [("A", "B"), ("A", "C"), ("B", "D"), ("C", "D")]
graph = defaultdict(list)
for start, end in edges:
graph[start].append(end)
print(graph)
# {'A': ['B', 'C'], 'B': ['D'], 'C': ['D']}
정리
- 장점:
- 기본값 처리를 자동화해 코드가 간결해집니다.
- 반복문에서 초기화 코드를 작성할 필요가 없습니다.
- 단점:
- defaultdict는 존재하지 않는 키에 기본값을 생성하므로, 키가 잘못 생성되는 문제가 있을 수 있습니다. 이 경우 값을 생성하지 않도록 신중히 사용해야 합니다.
- 언제 사용하나요?
- 키에 대한 기본값이 필요한 경우(예: 빈 리스트, 0, 빈 문자열 등).
- 데이터가 동적으로 추가되고, 키가 항상 미리 정의되지 않는 경우.
'Category > Python' 카테고리의 다른 글
| Python sorted() 함수에서 정렬 기준 설정하기 (0) | 2024.11.28 |
|---|---|
| Python에서 집합(set) 생성과 초기값 설정법 (0) | 2024.11.27 |
| 딕셔너리 확장 자료구조 Counter 사용하기 (1) | 2024.11.20 |
| Python의 collections 모듈 사용하기 (0) | 2024.11.20 |
| Python에서 heapq로 최대힙, 최소힙 구현하기 (0) | 2024.11.18 |