collections 모듈의 OrderedDict란?
파이썬 표준 배포판에는 collections 모듈이 포함되어 있으며, 이 모듈은 고성능 컨테이너 데이터 타입들을 제공합니다. 그중 OrderedDict는 딕셔너리의 하위 클래스로, 항목이 추가된 순서를 기억하는 특징이 있습니다. 순서가 있는 딕셔너리를 순회(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() 함수와 lambda 키로 값 기준 정렬하기
딕셔너리를 값 기준으로 정렬하려면 반복 가능한(iterable) 객체의 요소를 지정한 순서대로 정렬해 주는 sorted() 함수를 함께 사용해야 합니다. 이 함수는 정렬 기준으로 사용할 함수를 key 인자로 받습니다. 딕셔너리의 각 항목은 (키, 값) 형태의 튜플이므로, 값 기준으로 정렬하려면 람다(lambda) 함수를 통해 튜플의 두 번째 요소(t[1])를 정렬 키로 지정하면 됩니다.
>>> OrderedDict(sorted(D.items(), key = lambda t: t[1]))
OrderedDict([(4, 'bbb'), (2, 'ddd'), (5, 'fff'), (1, 'ooo'), (3, 'ttt')])
OrderedDict를 일반 딕셔너리로 변환하기
정렬된 결과를 일반 딕셔너리 객체로 변환하고 싶다면 dict() 생성자에 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부터는 일반 딕셔너리도 삽입 순서를 유지하도록 언어 명세에 포함되었기 때문에, 최신 버전에서는 dict(sorted(D.items(), key=lambda t: t[1]))처럼 바로 일반 딕셔너리로 정렬 결과를 생성해도 순서가 보장됩니다. 다만 하위 버전 호환성이 필요하거나 순서 유지 의미를 명확히 드러내고 싶을 때는 OrderedDict를 사용하는 것이 좋습니다.