파이썬에서 중첩된(nested) 딕셔너리를 특정 기준에 따라 정렬해야 하는 경우가 자주 있습니다. 예를 들어 다음과 같은 형식의 딕셔너리가 있다고 가정해 보겠습니다.
{
'KEY1':{'name':'foo','data':1351,'completed':100},
'KEY2':{'name':'bar','data':1541,'completed':12},
'KEY3':{'name':'baz','data':58413,'completed':18}
}sorted() 함수와 lambda로 정렬하기
각 항목 내부의 completed 키 값을 기준으로 오름차순 정렬하려면, 파이썬 내장 함수인 sorted()와 람다(lambda) 함수를 함께 사용하면 됩니다. 람다 함수는 정렬 시 어떤 값을 기준으로 삼을지 지정하는 역할을 합니다.
my_collection = {
'KEY1':{'name':'foo','data':1351,'completed':100},
'KEY2':{'name':'bar','data':1541,'completed':12},
'KEY3':{'name':'baz','data':58413,'completed':18}
}
sorted_keys = sorted(my_collection, key=lambda x: (my_collection[x]['completed']))
print(sorted_keys)위 코드를 실행하면 각 항목의 completed 값(12 → 18 → 100)을 기준으로 오름차순 정렬된 결과를 얻을 수 있습니다.
['KEY2', 'KEY3', 'KEY1']
내림차순으로 정렬하기
반대로 큰 값부터 정렬하고 싶다면 reverse=True 옵션을 추가하면 됩니다.
sorted_keys = sorted(my_collection, key=lambda x: my_collection[x]['completed'], reverse=True) print(sorted_keys) # ['KEY1', 'KEY3', 'KEY2']
operator.itemgetter 활용하기
람다 대신 operator 모듈의 itemgetter를 사용할 수도 있습니다. 이 방식은 성능 면에서 약간 더 유리하고 코드 의도도 명확하게 드러낸다는 장점이 있습니다.
from operator import itemgetter
# items()와 함께 사용하는 방식
sorted_items = sorted(my_collection.items(), key=lambda item: itemgetter('completed')(item[1]))
print(sorted_items)정리
중첩 딕셔너리를 정렬할 때는 sorted()의 key 인자에 람다나 itemgetter를 전달하여 원하는 하위 키를 기준으로 삼으면 됩니다. 오름차순이 기본값이며, 내림차순이 필요하면 reverse=True만 추가하면 됩니다. 참고로 파이썬 3.7부터 일반 딕셔너리도 삽입 순서를 유지하므로, 정렬된 결과를 새 딕셔너리로 만들면 그 순서가 그대로 보존됩니다.