collections 모듈의 특화된 매핑형collections 모듈은 기본 dict를 확장한 4가지 특화 매핑형을 제공합니다.
OrderedDict — 순서 보존 딕셔너리Python 3.7+부터 기본 dict도 삽입 순서를 보존하지만, OrderedDict는 순서 기반 동작에 특화된 추가 기능을 제공합니다.
from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
# move_to_end: 특정 키를 앞/뒤로 이동
od.move_to_end('a') # 맨 뒤로
od.move_to_end('c', last=False) # 맨 앞으로
# OrderedDict([('c', 3), ('b', 2), ('a', 1)])
# popitem: LIFO(last=True) 또는 FIFO(last=False)
od.popitem(last=False) # ('c', 3) — 맨 앞 제거
일반 dict와의 차이:
OrderedDict는 순서까지 고려해서 동등성을 비교합니다.
OrderedDict([('a',1),('b',2)]) != OrderedDict([('b',2),('a',1)])
defaultdict — 기본값 자동 생성 딕셔너리존재하지 않는 키에 접근할 때 KeyError 대신 기본값을 자동 생성합니다.
from collections import defaultdict
# 기본값 팩토리: list
dd = defaultdict(list)
dd['fruits'].append('apple') # 키 없어도 자동으로 [] 생성
dd['fruits'].append('banana')
# defaultdict(<class 'list'>, {'fruits': ['apple', 'banana']})
# 기본값 팩토리: int (카운팅에 유용)
counter = defaultdict(int)
for word in ['a', 'b', 'a', 'c', 'a']:
counter[word] += 1
# defaultdict(<class 'int'>, {'a': 3, 'b': 1, 'c': 1})
# 기본값 팩토리: 람다
dd2 = defaultdict(lambda: 'N/A')
dd2['missing'] # 'N/A'
ChainMap — 다중 매핑 통합 뷰여러 딕셔너리를 복사 없이 하나처럼 묶어서 조회합니다. 앞쪽 맵이 우선순위를 가집니다.
from collections import ChainMap
defaults = {'color': 'red', 'user': 'guest', 'theme': 'light'}
env_vars = {'user': 'admin', 'theme': 'dark'}
cli_args = {'color': 'blue'}
# 우선순위: cli_args > env_vars > defaults
config = ChainMap(cli_args, env_vars, defaults)
print(config['color']) # 'blue' ← cli_args
print(config['user']) # 'admin' ← env_vars
print(config['theme']) # 'dark' ← env_vars
# 새 컨텍스트 추가 (원본 불변)
new_config = config.new_child({'color': 'green'})
활용: 설정값 우선순위 처리, 스코프 체인(변수 탐색), CLI 인자 + 환경변수 + 기본값 병합
Counter — 빈도 계산 딕셔너리요소의 개수를 세는 데 특화된 딕셔너리로, 없는 키는 0을 반환합니다.
from collections import Counter
# 다양한 생성 방법
c1 = Counter('aabbccca') # 문자열
c2 = Counter(['a', 'b', 'a', 'c', 'b', 'a']) # 이터러블
c3 = Counter({'a': 3, 'b': 2}) # 딕셔너리
c = Counter('aabbccca')
# Counter({'a': 3, 'c': 3, 'b': 2})
# 가장 흔한 n개
c.most_common(2) # [('a', 3), ('c', 3)]
# 산술 연산 지원
c4 = Counter('aab')
c5 = Counter('abc')
print(c4 + c5) # Counter({'a': 3, 'b': 2, 'c': 1})
print(c4 - c5) # Counter({'a': 1}) — 양수만 보존
print(c4 & c5) # Counter({'a': 1, 'b': 1}) — 교집합(최솟값)
print(c4 | c5) # Counter({'a': 2, 'b': 1, 'c': 1}) — 합집합(최댓값)
# elements(): 개수만큼 반복 반환
list(Counter({'a': 3, 'b': 1}).elements())
# ['a', 'a', 'a', 'b']
| 매핑형 | 핵심 기능 | 주요 사용 사례 |
|---|---|---|
OrderedDict | 순서 기반 조작 (move_to_end, popitem) | LRU 캐시, 순서 민감 비교 |
defaultdict | 없는 키 → 기본값 자동 생성 | 그루핑, 중첩 딕셔너리, 카운팅 |
ChainMap | 여러 dict를 복사 없이 통합 조회 | 설정 우선순위, 스코프 체인 |
Counter | 빈도 계산 + 집합 연산 | 단어 빈도, 통계, 최빈값 |
모두 dict를 상속하므로 기존 딕셔너리 메서드를 그대로 사용할 수 있습니다.