반응형
'- 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으로 디폴트를 만들어 주어야 한다.
반응형
댓글