본문 바로가기
[Language] - Python

# 14. dictionary setdefault, defaultdict

by Bebsae 2021. 5. 28.

그동안 여러모로 일이 많아서 포스트가 미뤄졌습니다.. (--) (__)

 

그동안 새로 알게된 사실들을 차근차근 정리하고자 한다.. 우선 딕셔너리에 기본값을 설정하는 깔끔한 방법부터 정리하겠다!

 

이번 포스트에서 다룰 내용은 크게 두 가지이다.

첫 번째는 setdefault() 메소드를 활용하여 단일 키값에 대한 기본값 설정,

두 번째는 defaultdict 컬렉션을 활용하여 대입되는 키값에 대한 기본값 설정이다.

 

바로 코드로 확인해보겠다.

 

# setdefault 를 알기 전, 각 키별로 기본값을 설정하는 방법
def set_default_value():
    d = dict()
    keys = [1, 2, 3, 4, 5]
    for k in keys:
        d[k] = list()
    print(d)

만약 각 키값에 리스트를 기본값으로 설정하고 싶다면.. for loop를 통해 다음과 같이 설정했을 것이다. 하지만 딕셔너리에 지정되어 있는 키값 이외에 다른 키값으로 접근하면 KeyError가 날것이다..

존재하지 않는 키값으로 접근하여 KeyError가 나는 모습

 

하지만 우리는 이런 상황마다 일일이 예외처리를 할것인가?! 물론 해도된다. 하지만 조잡한 코드를 똥을 뿌리듯이 생산할 수 있다.. 

 

# setdefault 를 알고난 이후
def set_default_value_v2():
    d2 = dict()
    # 기본값 리턴
    res = d2.setdefault(1, list())
    print(d2)
    print(res)
    
>>
{1: []}  # print(d2)
[]  # print(res)

setdefault()의 인자로 설정할 키값기본값을 주면된다. 놀랍게도 setdefault() 메소드는 리턴값이 지정한 기본값을 다시 내뱉는다는 사실이다. 그치만 우리는 인간이기 때문에 setdefault에서 만족하지 않고 도구를 더욱 활용해야 한다.

 

# comprehension 의 응용
def set_default_value_v3():
    d3 = dict()
    keys = [1, 2, 3, 4, 5]
    [d3.setdefault(k, list()) for k in keys]
    print(d3)
    
    >>
    {1: [], 2: [], 3: [], 4: [], 5: []}

물론 for loop가 나쁜것은 아니다. 하지만, 가능하면 comprehension을 지향하자. (내부적으로 속도가 빠르다.) 뭐.. 아무튼 comprehension을 통해 keys 리스트를 iterative하게 순회하면서 setdefault() 메소드를 호출하는 모습이다. 그치만 이놈도.. 결국에는 내가 키값을 직접 다 입력해주어야 한다. -_-;; 이 얼마나 답답한 노릇일까! 다음을 보자.

 

def init_default_dict():
    from collections import defaultdict
    
    d4 = defaultdict(int)
    print(d4['a'])
    
    d5 = defaultdict(list)
    print(d5)
    print(d5['b'])
    
>>
0  # print(d4['a'])
defaultdict(<class 'list'>, {})  # print(d5)
[]  # print(d5['b'])

우선 collections 모듈의 defaultdict 클래스를 import 해주어야 한다.  

그리고 여기서 중요한 점은 defaultdict 클래스의 생성자를 호출할 때 인자로 기본값으로 설정할 타입을 명시해줘야 한다. d4같은 경우에는 int 타입 (실제로는 클래스)를 지정하고 존재하지 않는 키값 'a'로 접근할 때, 0을 반환하는 모습을 보여준다. list를 인자로 대입한 d5같은 경우에는 빈 리스트를 반환하는 것을 확인할 수 있다.

 

'[Language] - Python' 카테고리의 다른 글

# 16. eval  (0) 2021.08.02
# 15. [Tip] chunk  (0) 2021.06.02
# 13. [Tip] win32com 모듈을 사용한 엑셀 제어  (0) 2021.04.20
# 12. 제너레이터 (Generator)  (0) 2021.04.14
# 11. [Tip] dictionary merge  (0) 2021.04.14

댓글