1 분 소요

이론

이 글을 참고했다.

defaultdict()는 딕셔너리를 만드는 dict 클래스의 서브 클래스이다.
작동하는 방식은 거의 동일한데, defaultdict()는 인자로 주어진 객체(default-factory)의 기본값을 딕셔너리의 초기값으로 지저할 수 있다.
int, list, set 등으로 초기화 할 수 있기 때문에 여러 용도로 사용할 수 있다.

defaultdict(int)

from collections import defaultdict # ✅ 외부함수이기 때문에 import 해야 한다

int_dic = defaultdict(int)
print(int_dic) # defaultdict(<class 'int'>, {})

defaultdict(int)으로 디폴트 값이 int인 딕셔너리를 생성할 수 있다.

int_dic['key1']
print(int_dic['key1']) # 0
print(int_dic) # defaultdict(<class 'int'>, {'key1': 0})

int_dic['key2'] = 'test'
print(int_dic['key2']) # test
print(int_dic) # defaultdict(<class 'int'>, {'key1': 0, 'key2': 'test})

위와 같이 지정하지 않은 키는 그 값이 0으로 저장되고,
키에 명시적으로 값을 지정하면 그 값이 저장된다.

defaultdict(list)

from collections import defaultdict

lst_dic = defaultdict(list)
print(lst_dic) # defaultdict(<class 'list'>, {})

lst_dic['key1'] # 값을 지정하지 않으면 빈 리스트로 초기화
print(lst_dic['key1']) # []
print(lst_dic) # defaultdict(<class 'list'>, {'key1': []})

lst_dic['key2'].append('test1') # ✅ 존재하지 않는 key2에 대해 바로 append 가능
lst_dic['key2'].append('test2')
print(lst_dic['key2']) # ['test1', 'test2']
print(lst_dic) # defaultdict(<class 'list'>, {'key1': [], 'key2': ['test1', 'test2']})

마찬가지로 defaultdict(list)으로 디폴트 값이 list인 딕셔너리를 생성할 수 있다.

defaultdict(set)

from collections import defaultdict

set_dic = defaultdict(set)
print(set_dic) # defaultdict(<class 'set'>, {})

set_dic['key1'] # 값을 지정하지 않으면 빈 셋으로 초기화
print(set_dic['key1']) # set()
print(set_dic) # defaultdict(<class 'set'>, {'key1': set()})

set_dic['key2'] = 'test'
print(set_dic['key2']) # test
print(set_dic) # defaultdict(<class 'set'>, {'key1': set(), 'key2': 'test'})

마찬가지로 defaultdict(list)으로 디폴트 값이 list인 딕셔너리를 생성할 수 있다.

활용

딕셔너리의 value로 리스트를 사용하고 싶은 경우,
각 키에 대해 빈 리스트로 초기화 해주지 않으면 에러가 발생한다.

기대하는 것

아래처럼 딕셔너리의 value 값을 리스트 타입으로 만들고 싶다.

dic = {
  'apple': [1,2,3],
  'banana': [4,5]
}

에러가 발생하는 경우

dic = dict()

dic['apple'].append(1) # 'apple'이라는 키가 없기 때문에 append 에러 발생

해결 1. 빈 리스트로 초기화

keys = ['apple', 'banana']   값이 주어진다면

dic = dict() # ✅ dict() 이용

for val in range(keys):
  dic[val] = [] # ✅ 빈 리스트 초기화

dic['apple'].append(1) # 에러가 발생하지 않는다

해결 2. defaltdict 사용

🌟 defaltdict를 이용해서 더 간단하게 에러를 해결할 수 있다!

from collections import defaultdict

dic = defaultdict(list) # ✅ defaultdict() 이용 # list 자료형으로 초기화

dic['apple'].append(1) # ✅ 특정 키 값에 대한 초기화 없이도 에러가 발생하지 않는다
dic['apple'].append(2)
dic['apple'].append(3)

아래와 같이 출력해서 확인할 수 있다.

print(dic) # defaultdict(<class 'list'>, {'apple': [1, 2, 3]})

for val in dic.items():
    print(val)
# ('apple', [1, 2, 3])


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그:

카테고리:

업데이트: