defaultdict

우리가 좋아하는 다음과 같은 문장을 보자.

Life is too short, you need python

위 문장에서 각 문자(character)가 몇 개씩 있는지 알고 싶다면 어떻게 해야 할까?

딕셔너리를 이용하면 다음과 같은 코드를 만들 수 있을 것이다.

>>> a = 'Life is too short, you need python'
>>> d = dict()
>>> for c in a:
...     if c in d:
...         d[c] += 1
...     else:
...         d[c] = 1
... 
>>> d.items()
dict_items([('L', 1), ('i', 2), ('f', 1), ('e', 3), (' ', 6), ('s', 2), ('t', 3), ('o', 5), ('h', 2), ('r', 1), ('y', 2), ('u', 1), ('n', 2), ('d', 1), ('p', 1)])

위 코드 작성시 주의 할 점은 if c in d: 구문 처럼 딕셔너리 d에 해당 키 값이 있는지 조사하는 부분이다. 해당 키 값이 이미 있을때는 값을 1만큼 증가시켜 주고 없을 경우에는 1이라는 초기 값을 세팅해 주었다.

이렇듯 딕셔너리의 키에 해당되는 값을 추가하거나 변경할 경우에는 위처럼 방어적인 코드가 반드시 필요하다. defaultdict를 이용하면 이러한 방어적인 코드를 작성해야 하는 스트레스를 줄여줄 수 있다.

defaultdict를 이용하면 위 코드를 다음과 같이 작성할 수 있다.

>>> from collections import defaultdict
>>> a = 'Life is too short you need python'
>>> d = defaultdict(int)
>>> for c in a:
...     d[c] += 1
... 
>>> d.items()
dict_items([('L', 1), ('i', 2), ('f', 1), ('e', 3), (' ', 6), ('s', 2), ('t', 3), ('o', 5), ('h', 2), ('r', 1), ('y', 2), ('u', 1), ('n', 2), ('d', 1), ('p', 1)])

d 객체에 키가 있는지 조사하여 방어적으로 코딩했던 부분을 생략할 수 있음을 알 수 있다. d = defaultdict(int) 라는 문장은 d라는 defaultdict 객체의 디폴트 값은 int라는 의미이다. 따라서 d에 해당 키 값이 없을 경우 자동적으로 int의 초기값인 0이라는 값이 저장되게 된다.

이번에는 int가 아닌 list를 디폴트 값으로 활용하는 예를 보자.

>>> s = [('a', 100), ('b', 200), ('c', 300), ('a', 150), ('c', 120)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
... 
>>> d.items()
dict_items([('a', [100, 150]), ('b', [200]), ('c', [300, 120])])

딕셔너리의 value에 초기값으로 빈 리스트가 올 수 있도록 d = defaultdict(list)와 같이 선언 해 주어 깔끔한 코드를 작성할 수 있는 모습이다.

박응용 353

2020년 7월 8일 10:45 오후

목록으로