딕셔너리(dictionary)를 각각 아이템의 값(value)로 정렬(sort)해야 할 일이 있습니다.
예를 들어서 특정 문서에서 각각의 알파벳이 나온 횟수를 저장할 때, 딕셔너리의 키(key)를 알파벳으로, 값(value)를 나온 횟수로 저장할 수 있습니다. 만약 어떤 알파벳이 제일 많이 쓰였는지를 알고 싶을때는 딕셔너리의 값으로 정렬을 해야겠지요. 아래 예제에서 확인해 보겠습니다.
import operator
d = {'a': 5, 'x': 2, 'd': 3, 'c': 1, 'e': 0} # 알파벳을 카운팅한 결과가 딕셔너리로 저장 되었습니다.
# 딕셔너리를 아이템별 리스트로 가져와서 아이템의 인덱스 첫번째(즉, value) 값을 키로 정렬합니다.
sorted_by_value = sorted(d.items(), key=operator.itemgetter(1), reverse=True)
print(sorted_by_value) # 키값으로 정렬된 리스트를 출력합니다.
# [('a', 5), ('d', 3), ('x', 2), ('c', 1), ('e', 0)]
위의 예제에서 처럼, 딕셔너리는 자체적으로 정렬을 지원하지 않기 때문에 리스트로 변환해서 정렬을 하게되죠. operator 모듈을 사용하지 않고 lambda를 사용할 수 도 있습니다.
sorted_by_value = sorted(d.items(), key=lambda x: x[1], reverse=True)
print(sorted_by_value)
# [('a', 5), ('d', 3), ('x', 2), ('c', 1), ('e', 0)]
만약 알파벳이 나온 횟수를 작은것 부터 정렬하고자 한다면 sorted()의 reverse 파라미터를 False로 주면 되겠죠.
# sorted의 reverse는 기본적으로 False이기 때문에 reverse 인자를 생략해도 동일한 결과가 나옵니다.
sorted_by_value = sorted(d.items(), key=lambda x: x[1], reverse=False)
print(sorted_by_value)
# [('e', 0), ('c', 1), ('x', 2), ('d', 3), ('a', 5)]
결과를 딕셔너리 형태로 만들고 싶다면 OrderedDict를 사용하면 됩니다.
import collections
d = {'a': 5, 'x': 2, 'd': 3, 'c': 1, 'e': 0}
sorted_by_value = sorted(d.items(), key=lambda x: x[1], reverse=False)
sorted_dict = collections.OrderedDict(sorted_by_value)
print(sorted_dict)
# OrderedDict([('e', 0), ('c', 1), ('x', 2), ('d', 3), ('a', 5)])
참고로, 딕셔너리를 키값으로 정렬하기 위해서는 아래처럼 하시면 됩니다.
d = {'a': 5, 'x': 2, 'd': 3, 'c': 1, 'e': 0}
sorted_by_key = sorted(d.items())
print(sorted_by_key)
# [('a', 5), ('c', 1), ('d', 3), ('e', 0), ('x', 2)]
'파이썬 > 자주하는 질문' 카테고리의 다른 글
파이썬(Python) if else 구문을 한 줄로 표현하기 (0) | 2020.09.15 |
---|---|
파이썬(Python) 두 개의 리스트를 동시에 순회하기 (0) | 2020.09.13 |
파이썬(Python) *args **kwargs 는 무엇일까? (0) | 2020.09.12 |
파이썬(Python) 외부 프로그램 실행하기 (0) | 2020.09.11 |
파이썬(Python) yield 키워드 이해하기 (0) | 2020.09.11 |
댓글