Python의 Dictionary
Python의 dict는 키-값 쌍을 저장하는 대표적인 해시 기반 자료구조입니다.
dict와 defaultdict 차이
- dict: Python의 기본적인 해시 기반 맵 자료구조. 존재하지 않는 키를 조회하면 KeyError 발생.
- defaultdict: collections 모듈에 포함된 dict의 서브클래스. 존재하지 않는 키를 조회할 때, 미리 지정한 기본값을 자동으로 생성.
import 방법
# dict는 내장 자료형이므로 별도 import 필요 없음
d = {}
# defaultdict는 collections 모듈에서 import
from collections import defaultdict
dd = defaultdict(int) # 기본값이 0인 딕셔너리
dict
주요 메서드/속성 정리 (dict)
메서드/속성 | 설명 |
---|---|
get(key[, default]) | 키에 해당하는 값을 반환. 없으면 default 반환(기본값 None, KeyError 발생하지 않음) |
setdefault(key[, default]) | 키가 있으면 값 반환, 없으면 default로 추가 후 반환 |
update([other]) | 다른 dict나 (키,값) 쌍으로 현재 dict 갱신 |
pop(key[, default]) | 키에 해당하는 값을 반환하고 삭제. 없으면 default 반환, default 없으면 KeyError |
keys() | 모든 키를 dict_keys 객체로 반환(이터러블) |
values() | 모든 값을 dict_values 객체로 반환(이터러블) |
items() | 모든 (키, 값) 쌍을 dict_items 객체로 반환(이터러블) |
in | 키 존재 여부 확인 (key in dict) |
len(dict) | 요소 개수 반환 |
clear() | 모든 요소 삭제 |
사용법 (dict)
d = {'a': 1, 'b': 2}
# get(key[, default])
print(d.get('a')) # 1 (존재하면 값 반환)
print(d.get('z')) # None (존재하지 않으면 None 반환)
print(d.get('z', 0)) # 0 (기본값 지정 가능)
# setdefault(key[, default])
print(d.setdefault('b', 10)) # 2 (이미 있으면 기존 값 반환)
print(d.setdefault('c', 10)) # 10 (없으면 추가 후 반환)
print(d) # {'a': 1, 'b': 2, 'c': 10}
# update([other])
d.update({'a': 100, 'd': 4})
print(d) # {'a': 100, 'b': 2, 'c': 10, 'd': 4}
# pop(key[, default])
print(d.pop('a')) # 100 (값 반환 및 삭제)
print(d.pop('z', -1))# -1 (없으면 기본값 반환)
# print(d.pop('z')) # KeyError (기본값 없으면 예외)
# keys(), values(), items()
print(list(d.keys())) # ['b', 'c', 'd']
print(list(d.values())) # [2, 10, 4]
print(list(d.items())) # [('b', 2), ('c', 10), ('d', 4)]
# in
print('b' in d) # True
print('z' in d) # False
# len(dict)
print(len(d)) # 3
# clear()
d.clear()
print(d) # {}
순회 (dict)
d = {'x': 10, 'y': 20}
for key, value in d.items():
print(key, value)
# 또는
for key in d:
print(key, d[key])
defaultdict
주요 메서드/속성 정리 (defaultdict)
메서드/속성 | 설명 |
---|---|
default_factory | 기본값 생성 함수 (예: int, list, lambda 등). None이면 KeyError 발생 |
get(key[, default]) | dict와 동일. 키가 없으면 default_factory가 있으면 기본값 생성, 없으면 default 반환 |
setdefault(key[, default]) | dict와 동일. 키가 없으면 default_factory로 생성, default 지정 시 해당 값으로 추가 |
update([other]) | dict와 동일 |
pop(key[, default]) | dict와 동일 |
keys(), values(), items() | dict와 동일 |
in | dict와 동일 |
len(dict) | dict와 동일 |
clear() | dict와 동일 |
append(value) | 값이 list일 때, 해당 리스트에 요소 추가. 예: dd[key].append(x) |
사용법 (defaultdict)
from collections import defaultdict
dd = defaultdict(int)
dd['x'] += 1
print(dd['x']) # 1
print(dd['y']) # 0 (키가 없어도 0 반환)
# setdefault, update, pop 등 dict와 동일하게 사용 가능
print(dd.setdefault('z', 5)) # 5
print(dd['z']) # 5
dd.update({'a': 10})
print(dd['a']) # 10
print(dd.pop('a')) # 10
print(list(dd.keys())) # ['x', 'y', 'z'] (pop 이후)
print(list(dd.values())) # [1, 0, 5]
print(list(dd.items())) # [('x', 1), ('y', 0), ('z', 5)]
순회 (defaultdict)
from collections import defaultdict
dd = defaultdict(list)
dd['a'].append(1)
dd['b'].append(2)
for key, value in dd.items():
print(key, value)
# 또는
for key in dd:
print(key, dd[key])
dict와 defaultdict 차이점 요약
구분 | dict | defaultdict |
---|---|---|
존재하지 않는 키 조회 | KeyError 발생 | 기본값 자동 생성 |
기본값 지정 | get(), setdefault()로 수동 지정 | 생성 시 지정 (int, list, lambda 등) |
용도 | 일반적인 매핑 | 카운팅, 그룹핑 등 기본값 활용 |
활용 예시
- 빈도수 집계, 빠른 데이터 조회, 매핑 테이블 등
dict와 defaultdict 실전 활용 팁 및 주의사항
setdefault vs update 차이
- setdefault(key, value): 해당 키가 이미 있으면 값을 수정하지 않고 기존 값을 반환합니다. 키가 없을 때만 value로 추가합니다.
- update(
{key: value}
):- 해당 키가 이미 있으면 기존 값을 덮어씁니다.
- 여러 키-값 쌍을 한 번에 추가/수정할 때 유용합니다.
예시
d = {'a': 1}
d.setdefault('a', 100) # 1 (수정 X)
d.update({'a': 100}) # d['a'] == 100 (덮어쓰기)
실전에서 자주 쓰는 패턴/주의사항
- setdefault는 "기본값만 세팅"할 때, update는 "값을 무조건 갱신"할 때 사용
- defaultdict(list)는 그룹핑, 집계 등에 매우 유용 (예: 키별로 값 모으기)
- defaultdict(int)는 카운팅에 자주 사용 (예: 빈도수 집계)
- dict는 키가 없을 때 KeyError가 나므로, get()이나 setdefault()로 안전하게 접근
- defaultdict는 키가 없어도 자동으로 기본값이 생성되므로, 의도치 않게 키가 추가될 수 있음에 주의
- append는 list 타입 값에만 사용 가능 (defaultdict(list)에서 자주 활용)
실전 예시: defaultdict(list)로 그룹핑
from collections import defaultdict
data = [('A', 1), ('B', 2), ('A', 3)]
groups = defaultdict(list)
for key, value in data:
groups[key].append(value)
print(groups) # {'A': [1, 3], 'B': [2]}
실전 예시: defaultdict(int)로 카운팅
from collections import defaultdict
words = ['apple', 'banana', 'apple']
cnt = defaultdict(int)
for w in words:
cnt[w] += 1
print(cnt) # {'apple': 2, 'banana': 1}
실전 예시: setdefault로 안전하게 리스트에 값 추가
d = {}
for k, v in [('A', 1), ('A', 2)]:
d.setdefault(k, []).append(v)
print(d) # {'A': [1, 2]}
실전 예시: update로 값 덮어쓰기
d = {'a': 1}
d.update({'a': 100, 'b': 2})
print(d) # {'a': 100, 'b': 2}