본문 바로가기
파이썬/자주하는 질문

파이썬(Python) 딕셔너리 값(value)로 정렬하기

by J-Build 2020. 9. 13.

딕셔너리(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)]

 

 

댓글