<개인공부>/[Python]

[python] 파이썬 딕셔너리 정렬

BlockDMask 2021. 9. 15. 00:30
반응형

안녕하세요. 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 기준으로 정렬을 해보았습니다.
도움이 되었나요?
감사합니다.

반응형