한양과학기술고등학교

에듀테크 프로젝트 대시보드

collections 모듈

Counter defaultdict deque namedtuple OrderedDict

표준 컨테이너를 보완하는 특수 자료구조들.

1. Counter — 개수 세기

from collections import Counter
c = Counter("banana")
# Counter({'a': 3, 'n': 2, 'b': 1})
c["a"]              # => 3
c["z"]              # => 0  (KeyError 없음)
c.most_common(2)    # => [('a', 3), ('n', 2)]
c.total()           # => 6  (3.10+)

Counter([1, 1, 2]) + Counter([1, 3])   # => Counter({1: 3, 2: 1, 3: 1})

2. defaultdict — 자동 기본값

from collections import defaultdict

groups = defaultdict(list)
for word in ["apple", "avocado", "banana"]:
    groups[word[0]].append(word)   # 키 없어도 [] 자동 생성
# {'a': ['apple', 'avocado'], 'b': ['banana']}

counts = defaultdict(int)
for ch in "banana":
    counts[ch] += 1

nested = defaultdict(lambda: defaultdict(int))

3. deque — 양방향 큐

from collections import deque
q = deque([1, 2, 3])
q.append(4)          # 오른쪽 추가
q.appendleft(0)      # 왼쪽 추가       => deque([0, 1, 2, 3, 4])
q.pop()              # 오른쪽 제거
q.popleft()          # 왼쪽 제거 — list 와 달리 O(1)

# 최근 N개만 유지
recent = deque(maxlen=3)
for x in range(5):
    recent.append(x)   # => deque([2, 3, 4], maxlen=3)

q.rotate(1)          # 회전
list vs deque
  • 리스트의 pop(0) / insert(0, x) 는 O(n) — 큐로 쓰면 느림
  • deque 는 양끝 삽입·삭제가 O(1), 대신 가운데 인덱싱은 O(n)

4. namedtuple

from collections import namedtuple
Color = namedtuple("Color", "r g b")   # 공백 구분도 OK
white = Color(255, 255, 255)
white.r                # => 255
r, g, b = white        # 언패킹
white._asdict()        # => {'r': 255, 'g': 255, 'b': 255}

5. OrderedDict / ChainMap

from collections import OrderedDict, ChainMap

# 일반 dict 도 3.7+ 는 순서 유지 → OrderedDict 는 move_to_end 등이 필요할 때만
od = OrderedDict.fromkeys("abc")
od.move_to_end("a")          # => c b a

# ChainMap — 여러 dict 를 하나처럼 (앞이 우선), 설정 병합에 유용
defaults = {"color": "red", "size": "M"}
user = {"color": "blue"}
cfg = ChainMap(user, defaults)
cfg["color"]  # => 'blue'
cfg["size"]   # => 'M' 
"단순함이 복잡함보다 낫다 (Simple is better than complex)"