Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 중첩 딕셔너리 정렬 방법: sorted()와 lambda 활용하기

파이썬에서 중첩된(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부터 일반 딕셔너리도 삽입 순서를 유지하므로, 정렬된 결과를 새 딕셔너리로 만들면 그 순서가 그대로 보존됩니다.