본문 바로가기
Category/Python

Python collections 모듈의 defaultdict 사용하기

by Corinee 2024. 11. 22.
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, 빈 문자열 등).
    • 데이터가 동적으로 추가되고, 키가 항상 미리 정의되지 않는 경우.