티스토리 뷰
collections - Container datatypes 에서 딕셔너리 서브클래스 3개를 살펴보겠습니다.
일반적인 딕셔너리랑 다르게 조금 특별한 점이 있습니다.
[1] defaultdict
딕셔너리에서 존재하지 않는 키를 조회할 경우 KeyError exception이 납니다.
하지만 defaultdict은 존재하지 않는 키를 조회하면 에러가 나는 것이 아니라
설정한 디폴트 값을 기준으로 해당 키에 대한 아이템을 딕셔너리에 추가해줍니다.
defaultdict의 first argument로 default_factory 를 제공해주면 됩니다.
디폴트값을 10이라고 해줄게요!
'라이언' 이라는 키값이 존재하지 않지만
KeyError도 안나고 디폴트 값을 기준으로 아이템을 딕셔너리에 추가해주는 것을 볼 수 있습니다.
from collections import defaultdict
def default_factory():
return 10
age_dict = defaultdict(default_factory)
age_dict['죠르디'] = 10
age_dict['곰돌이'] = 2
print(age_dict)
print(age_dict['라이언'])
print(age_dict)
// 결과
defaultdict(<function default_factory at 0x7f99c8269830>, {'죠르디': 10, '곰돌이': 2})
10
defaultdict(<function default_factory at 0x7f99c8269830>, {'죠르디': 10, '곰돌이': 2, '라이언': 10})
디폴트값을 0으로 하고 싶다면 default_factory 로 int 를 넘겨줘서
더 간단하게 쓸 수 있습니다 :-)
from collections import defaultdict
age_dict = defaultdict(int)
age_dict['죠르디'] = 10
age_dict['곰돌이'] = 2
print(age_dict)
print(age_dict['라이언'])
print(age_dict)
// 결과
defaultdict(<class 'int'>, {'죠르디': 10, '곰돌이': 2})
0
defaultdict(<class 'int'>, {'죠르디': 10, '곰돌이': 2, '라이언': 0})
[2] Counter
Counter는 element에 대한 개수를 계산해서
- key: element 값
- value: element의 개수
로 이루어진 딕셔너리를 만들어줍니다.
from collections import Counter
order_list = ['떡볶이', '튀김', '순대', '떡볶이', '오뎅', '떡볶이', '오뎅']
counter = Counter(order_list)
print(counter)
print(counter['떡볶이'])
// 결과
Counter({'떡볶이': 3, '오뎅': 2, '튀김': 1, '순대': 1})
3
elements를 count가 많은 순으로 원하는 개수만큼 list로 리턴해주는 most_common 메소드도 있습니다.
예를 들어 가장 주문량이 많은 TOP 2를 list로 얻을 수 있습니다.
from collections import Counter
order_list = ['떡볶이', '튀김', '순대', '떡볶이', '오뎅', '떡볶이', '오뎅']
counter = Counter(order_list)
print(counter.most_common(2))
// 결과
[('떡볶이', 3), ('오뎅', 2)]
Counter는 이런 데이터 통계 쪽 뿐만아니라
문자열에서 특정 문자를 카운트해야할 때나
다양한 연산을 해야할 때 유용하게 쓸 수 있을 것 같아보입니다 👍
[3] OrderedDict
딕셔너리는 순서가 유지되지 않습니다.
하지만 OrderedDict 은 이름그대로 순서가 유지되는 딕셔너리입니다.
from collections import OrderedDict
ordered_age_dict = OrderedDict({'라이언': 10, '곰돌이': 2})
ordered_age_dict['죠르디'] = 20
print(ordered_age_dict)
// 결과
OrderedDict([('라이언', 10), ('곰돌이', 2), ('죠르디', 20)])
하지만‼️
파이썬 3.7부터 기본 딕셔너리는 순서가 유지됩니다‼️
내부적으로 인덱스를 이용하여 입력 순서가 유지되도록 개선되었다고 합니다. (참고)
따라서 파이썬 3.7이상 쓴다면
순서 유지하고 싶을 때, 더 이상 OrderedDict을 사용할 필요없고 기본 딕셔너리 사용하면 됩니다.
OrderedDict은 파이썬 3.6 이하와 하위 호환성을 위해서 남아있다고 합니다.
'🐍 > Python' 카테고리의 다른 글
[Python] Sort 뽀개기 (0) | 2021.05.09 |
---|---|
[Python] any function (0) | 2021.05.05 |
[Python] f-string (🖐 %-formatting / str.format / string.Template) (0) | 2021.04.09 |
[Python] List Comprehension / Dict Comprehension (0) | 2021.04.09 |
[Python] gitignore 만들고 github에 올리는 스크립트를 작성해보자 (0) | 2021.01.22 |
- Total
- Today
- Yesterday
- Flutter Text Gradient
- Django Heroku Scheduler
- 장고 Custom Management Command
- 플러터 싱글톤
- flutter deep link
- Sketch 누끼
- Flutter Clipboard
- Python Type Hint
- 장고 URL querystring
- Flutter getter setter
- github actions
- ipad multitasking
- 구글 Geocoding API
- Dart Factory
- flutter 앱 출시
- ribs
- cocoapod
- drf custom error
- PencilKit
- Flutter 로딩
- Watch App for iOS App vs Watch App
- Django FCM
- DRF APIException
- Django Firebase Cloud Messaging
- 플러터 얼럿
- flutter dynamic link
- flutter build mode
- SerializerMethodField
- Flutter Spacer
- METAL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |