[python] 사전의 기본값 처리 collections.defaultdict

2021. 2. 16. 15:15Programming Language/Python

사전의 기본값 처리 collections.defaultdict

일반적인 dictionary 기본값 처리

숫자 리스트

li = [1,1,2,2,2,3,3,5]

의 출현 횟수를 count하는 경우를 생각해 봅시다.

 

딕셔너리를 이용해 구할 수 있습니다.
포문을 돌며 딕셔너리에 해당 값이 없을 경우엔 i가 키인 값을 0으로 초기화 해주고 모든 경우에 += 1 해줍니다.


li = [1,1,2,2,2,3,3,5]
dict = {}

for i in li:
    if i not in dict:
        dict[i] = 0
    dict[i] += 1

print(dict)
"""
{1: 2, 2: 3, 3: 2, 5: 1}
"""

if문을 사용해 존재하지 않는 키에 대한 값을 초기화 해주는 이유는 존재하지 않는 키에 접근했을 경우 다음과 같은 에러가 발생하기 때문입니다.

# 이렇게 할 경우
for i in li:
    dict[i] += 1

"""
다음과 같은 에러가 발생
    dict[i] += 1
KeyError: 1
"""

반면 defaultdict를 이용하면 if문을 이용한 처리 없이 기본값을 처리 할 수 있습니다.

 

collections 모듈의 defaultdict

collections.defaultdict는 딕셔너리에 없는 키값을 호출했을 때 오류처리를 하지 않고 default값으로 return 합니다.

collections모듈을 import 하여 사용합니다.

from collections import defaultdict
# import collections

이것을 사용하면 위의 코드보다 훨씬 간결하고 깔끔하게 기본값 처리가 가능합니다.

from collections import defaultdict

li = [1,1,2,2,2,3,3,5]
dict = defaultdict(int)

for i in li:
    dict[i] += 1

print(dict) # defaultdict(<class 'int'>, {1: 2, 2: 3, 3: 2, 5: 1})

 

기본값 int로 세팅 (또는 lambda: 0)

defaultdict의 기본값을 int로 세팅하면 int()는 0을 리턴하기 때문에 기본값을 0으로 세팅이 가능하다. lambda: 0도 같은 기능을 한다.

 

기본값 list로 세팅

list를 기본값으로 세팅하고 append()할 경우 해당 키값이 존재하지 않아도 오류를 뿜지 않고 빈 리스트로 세팅해주고 append가 가능하다.
필자는 주로 그래프를 정의해줄 때 쓴다.
1의 자식은 2,3,4 / 2의 자식은 5,6... 이런식으로 활용이 가능하기 때문이다.

from collections import defaultdict

"""
    1
 /\   /\
2  3 4  5
/        \
6         7

"""
tree = [[1,2],[1,3],[1,4],[1,5],[2,6],[5,7]]
dict = defaultdict(list)

for node in tree:
    dict[node[0]].append(node[1])

print(dict)
# defaultdict(<class 'list'>, {1: [2, 3, 4, 5], 2: [6], 5: [7]})

 

참고 자료

https://www.daleseo.com/python-collections-defaultdict/
https://dongdongfather.tistory.com/69

반응형

'Programming Language > Python' 카테고리의 다른 글

[Python] input()과 sys.stdin  (2) 2021.02.09
[Python] 파이썬에서 아스키코드 변환 (chr(), ord())  (0) 2021.02.07
[Python] zip()  (0) 2021.01.26
[Python] heapq 모듈  (0) 2021.01.19
[Python] Call by.. What?  (0) 2021.01.15