파이썬의 표준 라이브러리에는 collections 모듈이 포함되어 있으며, 이 모듈은 고성능 컨테이너 데이터 타입들을 제공합니다. 그중 OrderedDict는 딕셔너리의 하위 클래스로, 항목이 추가된 순서를 기억하는 특징이 있습니다. 정렬된 딕셔너리(ordered dictionary)를 반복(iteration)할 때는 키가 처음 추가된 순서대로 항목들이 반환됩니다.
>>> from collections import OrderedDict
>>> D = {5:'fff', 3:'ttt', 1:'ooo', 4:'bbb', 2:'ddd'}
>>> OrderedDict(D.items())
OrderedDict([(5, 'fff'), (3, 'ttt'), (1, 'ooo'), (4, 'bbb'), (2, 'ddd')])
딕셔너리를 값 기준으로 정렬하려면 sorted() 함수를 함께 사용해야 합니다. 이 함수는 반복 가능한(iterable) 객체의 요소를 지정한 순서대로 정렬하며, 정렬 기준으로 사용할 함수를 인자로 받습니다. 값을 기준으로 정렬하고자 하므로, 각 항목(키-값 쌍) 중 두 번째 요소인 값(value)을 정렬 키로 지정하면 됩니다.
>>> OrderedDict(sorted(D.items(), key=lambda t: t[1])) OrderedDict([(4, 'bbb'), (2, 'ddd'), (5, 'fff'), (1, 'ooo'), (3, 'ttt')])
위 코드에서 lambda t: t[1]은 각 키-값 쌍(튜플)에서 값에 해당하는 두 번째 요소를 반환하여 정렬 기준으로 삼습니다. 그 결과 값의 알파벳 순서('bbb' → 'ddd' → 'fff' → 'ooo' → 'ttt')대로 항목이 정렬됩니다.
일반 딕셔너리로 변환하기
OrderedDict 객체는 필요에 따라 일반 딕셔너리 객체로 다시 변환할 수 있습니다.
>>> D1 = dict(OrderedDict(sorted(D.items(), key=lambda t: t[1])))
>>> D1
{4: 'bbb', 2: 'ddd', 5: 'fff', 1: 'ooo', 3: 'ttt'}
참고로 파이썬 3.7부터는 일반 딕셔너리도 삽입 순서를 유지하므로, 최신 버전에서는 OrderedDict 없이 아래와 같이 간단하게 정렬된 딕셔너리를 만들 수도 있습니다.
>>> D1 = dict(sorted(D.items(), key=lambda item: item[1]))
>>> D1
{4: 'bbb', 2: 'ddd', 5: 'fff', 1: 'ooo', 3: 'ttt'}