본문 바로가기
Python/파이썬 클래스

defaultdict

by c급선임 2024. 6. 28.
반응형

'- collection 모듈에 들어 있는 defaultdict 이라는 Class

'- 기존에는 현재 딕셔너리에 포함되지 않는 key 값으로 접근하면 무조건 key error 가 발생 하지만, 해당 클래스로 만들어진 객체의 경우, 존재하지 않는 key에 접근해도 접근한 key에 default가 할당되면서 새로운 요소로 들어간다.

'- 객체가 될 변수 = defaultdict(인수) 의 인수는 '호출 가능한 객체' 만 기입이 가능하다. 즉 클래스, 함수,  메서드만 가능하다. 또한 sum()는 호출한 '결과' 이기 때문에 기입이 안되고 sum을 기입 해주어야 한다.

'- 인수에 딕셔너리를 넣고 싶다면 lambda 함수를 이용해서 딕셔너리를 반환토록 하면 된다.

 

from collection import defaultdict
int_dict = defaultdict(int)             # 이제부터 기본값은 정수 0
 
int_dict['key']                         # 여기서 없는 key를 인덱싱 했으므로 당연히 에러가 나야 하지만 0이라고 value가 출력된다.
 
int_dict['key2'] = 'test'               # 이건 일반 딕셔너리든 defaultdict의 객체든 선언하는 것이므로 에러 없이 추가된다.
 
### 또다른 예시
 
list_dict = defaultdict(list)
 
list_dict['key1']                       # 없는 key로 접근 한번 해준다.
list_dict                               # 조금 전에 Error성 접근 때문에 디폴트값이 들어가고 {'key1': []} 이 출력되며 빈 리스트가 value로 출력된다.
list_dict['key2'] = 'test'              # 이건 원래 딕셔너리 기능
list_dict                               # {'key1: [], 'key2' : 'test'} 가 출력된다.
 
 
### 응용
dict_dict = defaultdict(lambda : {'key1' : 'others1', 'key2' : 'others2'})      # lambda 함수는 함수명을 만들지 않고도 함수 동작을 정의할 수 있다. 따라서 함수 출력값이 아닌 호출 가능한 객체를 반환한다. 여기선 lambda 뒤에 딱히 인수가 없으므로 인수 없이 동작만 시작하면 딕셔너리를 반환해주는 함수이다.
dict_dict                               # 아직 빈 {}로 출력된다.
 
dict_dict['new_key']                        # Error성 접근으로 인해 value가 디폴트로 할당되고 {'new_key' : {'key1' : 'others1', 'key2' : 'others2'} } 로 출력된다.
dict_dict['new_key']['key1'] = 'value1'     # {'new_key' : {'key1' : 'value1', 'key2' : 'others2'} }로 출력된다. 이때는 조금 다른 것이 이렇게 이중딕셔너리로 할당할땐 첫번째 접근하는 key가 기존에 있는 key가 아니라면 에러가 발생한다. 따라서 defalutdict으로 디폴트를 만들어 주어야 한다.
반응형

댓글