1. 키가 존재할 때와 존재하지 않을 때
- dict의 문제점을 defaultdict로 해결하고자 하는 것

- 딕셔너리에 해당 키가 존재하는 경우, 대입 연산의 결과가 값의 수정으로 이어짐

- 해당 키가 존재하지 않는 경우, 대입 연산의 결과가 새로운 키와 값의 추가로 이어짐
- 딕셔너리 대입 연산 패턴
① 추가(대입) : 해당 키가 있는 경우
② 수정 : 해당 키가 없는 경우
→ if~else 함수 사용
- 저장되어 있는 값을 참조하는 경우, 그 키와 값이 존재하므로 += 연산 가능
- 그러나 해당 키가 존재하지 않으면 예외가 발생함

- 따라서 위의 경우일 때 if~else를 사용하면 됨
- 즉, 키가 존재할 때와 존재하지 않을 때의 상황 별 코드를 구분해야 함

- 키가 있는 경우, 없는 경우를 if~else 함수를 사용해서 구분한 예제
- d에 r값이 있으므로 1이 출력됨
- 첫번째 o의 경우, d에 존재하므로 1이 출력됨, 두 번째 o의 경우 d에 존재하므로 1이 출력됨
è 1 + 1 = 2

- 문자를 바꾸어 보았음
2. setdefault 메소드
- 위의 키와 값이 있는 경우와 없는 경우를 구분하기 위해 if~else를 사용하였음
- 그것을 setdefault로 간단하게 표현할 수 있음

- d.setdefault(k,0) + 1 : 키(k)와 값(0)을 setdefault에 저장하라
- if ~ else처럼 두 가지로 나뉘어짐
① 키가 존재하지 않는 경우
- 새로 등록
② 키가 존재하는 경우
- “그 키는 이미 등록되어 있고, 값은 (내가 지정해준 값)이야”
- 등록된 키의 값을 반환
- r의 값 : 일단 초기값을 0으로 지정, d에 r이 있으므로 +1을 해줌
3. defaultdict
* 오해할 수 있는 사항
- 현재 학습 순서 : if~else à s.default à defaultdict
- 수준의 순서가 아님
- 즉, 어느 정도 수준이나 실력이 있어야 defaultdict를 사용하는게 아니라, 방법의 종류일 뿐
* defaultdict
- default 값을 등록한 dictionary
- 원래 dictionary는 특정한 키를 참조하는 경우, 그 키가 등록이 안됐을 때 예외가 발생함
- 그러나, defaultdict는 내가 어떤 키를 불러왔을 때, 그 키가 등록이 안되어 있으면 예외를 발생시키지 않고 등록시키는 함수임
- 따라서 딕셔너리에 특정 키를 등록을 하되, 내가 설정해놓은 default값으로 저장됨

- collections 모듈에서 불러오겠음
- d = defaultdict(int) : default method를 int 함수로 지정
- d[k] += 1: r을 불러옴. R은 0이라고 디폴트값을 지정
- 정보까지 나오고, 딕셔너리를 어떻게 지정했는지도 나옴

- int함수에 부연설명하기 위한 예제
- int함수는 괄호 안에 무엇이 들어가든 정수로 반환함
- 즉 문자열 36이 정수 36으로 반환된 것을 알 수 있음
- 또 아무 내용 없이 빈 괄호만 담으면 0으로 반환됨
- 이렇게 등록된 int함수는 디폴트 값을 얻는데 사용됨

- 직접 함수를 만들어서 defaultdict 함수에 전달한 예제
- def zet_zero() : method 함수 정의 – 반복되는 코드, 기능, 행위를 쉽게 관리하는 함수
- d[‘a’] : a를 참조하겠다는 명령어 사용 à 등록이 안되어있음 à ret_zero( )가 반환하는 값
→ 즉, 0을 출력하게 되는 것

- lambda 함수를 사용한 예제 : 매개변수 없이 값을 반환하는 함수
→ 즉, 어떤 매개변수로 호출하든 상관없이 지정한 값이 나오게 됨
'윤성우의 열혈 파이썬 (중급)' 카테고리의 다른 글
| Story 17. dict & OrderedDict (0) | 2021.08.01 |
|---|---|
| [comma의 사용법] (0) | 2021.07.28 |
| Story 15. 함수 호출과 매개변수 선언에 있어서 *와 **의 사용 규칙 (0) | 2021.07.24 |
| Story 14. dict의 루핑 기술과 컴프리헨션 (0) | 2021.07.22 |
| Story 13. dict의 생성과 zip (0) | 2021.07.20 |