본문 바로가기

프로그래머/Python

[윤성우의 열혈 파이썬 중급편] 16. dict & defaultdict

출처 : 윤성우의 열혈 파이썬 : 중급

16. dict & defaultdict

키가 존재할 때와 존재하지 않을 때

d = {'red': 3, 'white': 2, 'blue': 4}
d['red'] = 1    # 키 'red'의 값을 1로 변경

d = {'red': 3, 'white': 2}
d['red'] = 1    # 'red' : 1 추가

저장되어 있는 값 참조

d = {'red': 3, 'white': 2, 'blue': 4}
d['red'] += 1   # 키 'red'의 값을 1 증가

d = {'red': 3, 'white': 2}
d['red'] += 1   # 해당 키가 존재하지 않음. error

# 키의 존재 여부에 따라 실행 코드를 구분할 필요
s = 'robbot'
d = {}
for k in s:
    if k in d:
        d[k] += 1
    else:
        d[k] = 1

setdefault 메소드

s = 'robbot'
d = {}
for k in s:
    d[k] = d.setdefault(k, 0) + 1
  • d.setdefault(k, v)
    • k에 해당하는 키가 있을 때, 그 키의 값을 반환한다
    • k에 해당하는 키가 없을 때, 딕셔너리에 k:v 저장하고 v를 반환한다
  • setdefault 메소드를 사용하면 if ~ else를 넣어서 복잡해질 수 있는 코드를 간결하게 구성할 수 있다

defaultdict

from collections import defaultdict
s = 'robbot'
d = defaultdict(int)
for k in s:
    d[k] += 1
  • defaultdict 함수는 디폴트 값을 갖는 딕셔너리를 생성해 반환한다
  • 찾는 키가 없으면 예외를 발생시키지 않고 해당 키를 추가하되, 미리 등록해 놓은 함수가 반환하는 디폴트 값을 그 키의 값으로 저장
  • 디폴트 값은 키를 저장하는 경우에 사용되는 기본 값을 의미한다

default 값

n1 = int('36')
print(n1)   # 36

n2 = int()
print(n2)   # 0
def ret_zero():
    return 0

d = defaultdict(ret_zero)
print(d['a'])   # 0

d = defaultdict(lambda: 7)
print(d['z'])   # 7