티스토리 뷰

🐍/Python

[Python] defaultdict / Counter / OrderedDict

사용자 eungding 2021. 4. 13. 02:03
728x90
반응형

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 이하와 하위 호환성을 위해서 남아있다고 합니다. 

 

 

 

728x90
반응형
댓글
댓글쓰기 폼