[Python] defaultdict()
이론
이 글을 참고했다.
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])
💛 개인 공부 기록용 블로그입니다. 👻