[python] 파이썬 딕셔너리 정렬
안녕하세요. BlockDMask입니다.
오늘은 파이썬 딕셔너리 정렬에 대해서 알아보겠습니다.
딕셔너리의 key를 기준으로 정렬도 해보고, value를 기준으로도 정렬을 해보겠습니다.
이번 딕셔너리 정렬에서 이용할 파이썬 함수는 sorted 함수입니다.
sorted 함수에 대해서 더 자세히 알고 싶다면 sorted 함수 정리 포스팅 [바로가기] 에서 확인하시면 됩니다.
<목차>
1. 딕셔너리 key 정렬
2. 딕셔너리 value 정렬
1. 파이썬 딕셔너리 key 정렬
딕셔너리를 정렬할 때 사용하는 함수는 sorted 함수입니다.
sorted 함수에 정렬 판단 기준을 입력하고, 정렬을 오름차순으로 할지 내림차순으로 할지 설정할 수 있습니다.
sorted 함수는 정렬할 딕셔너리를 매개변수로 넣으면, 정렬이 완료된 새로운 리스트를 반환해줍니다.
반환 값이 리스트 형태라서 당황하셨다면,
그땐 당황하지 말고 dict(~~) 함수를 통해서 리스트로 반환된 것을 다시 딕셔너리로 변환해주면 됩니다.
딕셔너리의 key 값을 정렬하는 방법은 dictionary의 items 메서드를 이용하는 방법이 있습니다.
- dictionary.items() 이용
만약 sorted 함수에 딕셔너리 객체 자체를 넣게 되면 딕셔너리의 key 만 빠져서 리스트가 됩니다.
예제로 보여드리겠습니다.
1-1) dictionary key 오름차순 정렬
d = {"dream": 0, "car": 99, "blockdmask": 1, "error": 30, "app": 20}
# 오리지널 딕셔너리
print(f'origin : {d}\n')
# dictionary.items()
d1 = sorted(d.items())
print(f'sorted(d.items()) : {d1}')
print(f'dict(sorted(d.items()) : {dict(d1)}')
print()
# 키 값만 빼서 정렬하려는 경우, key 만 빠지기 때문에 딕셔너리가 될수 없다.
d2 = sorted(d)
print(f'sorted(d) : {d2}')
결과를 보면 딕셔너리의 key를 기준으로 a, b, c 순서로 정렬되는 것을 볼 수 있습니다.
d1 = sorted(d.items())
위 코드에 의해서 딕셔너리 d가 정렬된 형태로 d1에 들어가게 됩니다.
sorted(d.items())를 출력한 것을 보면,
sorted 함수의 결과는 리스트로 변환되기 때문에 리스트 형태로 들어가 있는 것을 볼 수 있습니다.
리스트를 의미하는 "[" 대괄호로 묶여있는 걸 볼 수 있습니다.
dict(sorted(d.items()) 를 이용해서 sorted의 반환을 딕셔너리 형태로 변환한 것을 볼 수 있습니다.
딕셔너리를 의미하는 "{" 중괄호로 묶여있는 걸 볼 수 있습니다.
d2 = sorted(d)
d.items()가 아닌 딕셔너리 d 만 sorted 함수에 넘기게 되면 key 값들만 따로 빠져서 정렬이 됩니다.
출력된 결과를 보면 기존 딕셔너리의 value 값들이 모두 없어진 것을 볼 수 있습니다.
1-2) dictionary key 내림차순 정렬
내림차순은 sorted 함수의 reverse 매개변수의 값을 True로 변경만 하면 됩니다.
바로 위 예제를 동일하게 작성하고, reverse 값만 True로 변경해보겠습니다.
d = {"dream": 0, "car": 99, "blockdmask": 1, "error": 30, "app": 20}
# 오리지널 딕셔너리
print(f'origin : {d}\n')
# dictionary.items()
d1 = sorted(d.items(), reverse=True)
print(f'sorted(d.items(), reverse=True) : {d1}')
print(f'dict(sorted(d.items(), reverse=True) : {dict(d1)}')
print()
# 키 값만 빼서 정렬하려는 경우
d2 = sorted(d, reverse=True)
print(f'sorted(d, reverse=True) : {d2}')
이렇게 sorted 함수에 reverse=True 값을 넣어주면 내림차순으로 출력할 수 있습니다.
2. 파이썬 딕셔너리 value 정렬
딕셔너리 value에 대해서 접근을 할 때는 두 가지를 방법을 이용해서 할 수 있습니다.
- 예전 방법 : operator.itemgetter
- 최신 방법 : 람다 이용
두 가지 방법 모두 딕셔너리에서 value 값에 접근을 해서 sorted 함수의 정렬 키값으로 넘기기 위해 사용하는 것입니다.
두 방법 모두 사용해도 되는데, 람다를 이용한 방법이 좀 더 최신 방법이라는 점 알고 가시면 좋을 것 같습니다.
아래 예제에서 두 가지 방법 모두를 사용해서 예제 코드를 작성했습니다.
눈에 익거나 사용하기 편한 것을 사용하시면 됩니다.
sorted 함수에는 reverse 매개변수뿐만 아니라, key 매개변수가 존재하는데요.
sorted의 key 매개변수가 바로 '무엇을 기준으로 정렬하냐'입니다. 그래서 우리는 이 sorted의 key 매개변수를 조정해줄 것입니다.
(딕셔너리의 key 랑 헷갈리시면 안 돼요)
2-1) dictionary value 오름차순 정렬
import operator # operator.itemgetter를 사용하기 위해 모듈 임포트
d = {"dream": 0, "car": 99, "blockdmask": 1, "error": 30, "app": 20}
# 오리지널 딕셔너리
print(f'origin : {d}\n')
# operator.itemgetter
d1 = sorted(d.items(), key=operator.itemgetter(1))
print("1-1) sorted(d.items(), key=operator.itemgetter(1))의 결과")
print(d1)
print("\n1-2) dict(sorted(d.items(), key=operator.itemgetter(1)))의 결과")
print(dict(d1))
# lambda x : x[1]
d2 = sorted(d.items(), key=lambda x: x[1])
print("\n2-1) sorted(d.items(), key=lambda x: x[1])의 결과")
print(d2)
print("\n2-2) dict(sorted(d.items(), key=lambda x: x[1]))의 결과")
print(dict(d2))
결과를 보면 딕셔너리의 value를 기준으로 오름차순으로 정렬된 것을 볼 수 있습니다.
key=operator.itemgetter(1)을 이용해서 딕셔너리의 value 값을 기준으로 정렬할 수 있고
key=lambda x: x [1]을 이용해서도 딕셔너리 value 정렬을 할 수 있는 걸 볼 수 있습니다.
원하는 방법을 사용하시면 됩니다.
2-2) dictionary value 내림차순 정렬
import operator # operator.itemgetter를 사용하기 위해 모듈 임포트
d = {"dream": 0, "car": 99, "blockdmask": 1, "error": 30, "app": 20}
# 오리지널 딕셔너리
print(f'origin : {d}\n')
# operator.itemgetter
d1 = sorted(d.items(), key=operator.itemgetter(1), reverse=True)
print("1-1) sorted(d.items(), key=operator.itemgetter(1), reverse=True)의 결과")
print(d1)
print("\n1-2) dict(sorted(d.items(), key=operator.itemgetter(1), reverse=True))의 결과")
print(dict(d1))
# lambda x : x[1]
d2 = sorted(d.items(), key=lambda x: x[1], reverse=True)
print("\n2-1) sorted(d.items(), key=lambda x: x[1], reverse=True)의 결과")
print(d2)
print("\n2-2) dict(sorted(d.items(), key=lambda x: x[1], reverse=True))의 결과")
print(dict(d2))
이렇게 sorted 함수와 lambda 그리고 operator.itemgetter를 이용하면 딕셔너리 value 내림차순으로도 정렬할 수 있습니다.
이렇게 이번 포스팅에서는 파이썬 sorted 함수를 이용해서 딕셔너리를 key, value 기준으로 정렬을 해보았습니다.
도움이 되었나요?
감사합니다.