Python `collections` 모듈의 특화된 매핑형 (260519)

WonTerry·2026년 5월 19일

Python

목록 보기
8/28

Python collections 모듈의 특화된 매핑형

collections 모듈은 기본 dict를 확장한 4가지 특화 매핑형을 제공합니다.


1. 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)])


2. 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'

3. 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 인자 + 환경변수 + 기본값 병합


4. 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를 상속하므로 기존 딕셔너리 메서드를 그대로 사용할 수 있습니다.

profile
Hello, I'm Terry! 👋 Enjoy every moment of your life! 🌱 My current interests are Signal processing, Machine learning, Python, Database, LLM & RAG, MCP & ADK, Multi-Agents, Physical AI, ROS2...

0개의 댓글