파이썬의 딕셔너리를 다루다 보면 정렬을 해야하는 경우가 발생한다. 딕셔너리는 key와 value를 가지고 있으므로 key값을 기준으로 정렬, value값을 기준으로 정렬을 할 수 있다.

우선 기본적으로 리스트와 달리 sort()를 사용할 수 없고 sorted()만 사용할 수 있다.

 

① key값을 기준으로 정렬

dict1 = {'g': 1, 'b': 5, 'z': 8, 'e': 2, 'k': 10}


sorted_dict1 = sorted(dict1.items(), key=lambda x: x[0])

print(sorted_dict1) # [('b', 5), ('e', 2), ('g', 1), ('k', 10), ('z', 8)]
print(type(sorted_dict1)) # <class 'list'> ==> dict타입 아님 주의!!


sorted_dict1 = dict(sorted(dict1.items(), key=lambda x: x[0])) 

print(sorted_dict1) # {'b': 5, 'e': 2, 'g': 1, 'k': 10, 'z': 8}
print(type(sorted_dict1)) # <class 'dict'>

위의 코드와 같이 sorted()결과는 리스트로, 딕셔너리로 사용하고 싶으면 dict()를 이용해야 한다.

그리고 정렬된 key값만 얻고싶은 경우에는 key인자를 설정하지 않아도 된다.

dict1 = {'g': 1, 'b': 5, 'z': 8, 'e': 2, 'k': 10}


sorted_dict1 = sorted(dict1) 

print(sorted_dict1) # ['b', 'e', 'g', 'k', 'z']
print(type(sorted_dict1)) # <class 'list'>


sorted_dict1 = sorted(dict1.keys()) 

print(sorted_dict1) # ['b', 'e', 'g', 'k', 'z']
print(type(sorted_dict1)) # <class 'list'>

sorted()에 dict1로 하는 경우와 dict1.keys()로 한 경우가 동일한 결과를 갖는다. 결과 type은 리스트다.

 

② value값을 기준으로 정렬

dict1 = {'g': 1, 'b': 5, 'z': 8, 'e': 2, 'k': 10}


sorted_dict1 = sorted(dict1.items(), key=lambda x: x[1]) 

print(sorted_dict1) # [('g', 1), ('e', 2), ('b', 5), ('z', 8), ('k', 10)]
print(type(sorted_dict1)) # <class 'list'> ==> dict타입 아님 주의!!


sorted_dict1 = dict(sorted(dict1.items(), key=lambda x: x[1]))

print(sorted_dict1) # {'g': 1, 'e': 2, 'b': 5, 'z': 8, 'k': 10}
print(type(sorted_dict1)) # <class 'dict'>

마찬가지로 sorted()결과는 리스트로, 딕셔너리로 사용하고 싶으면 dict()를 이용해야 한다.

그리고 정렬된 value값만 얻고싶은 경우에는 간단하게 values()를 이용하면 된다.

dict1 = {'g': 1, 'b': 5, 'z': 8, 'e': 2, 'k': 10}


sorted_dict1 = sorted(dict1.values()) 

print(sorted_dict1) # [1, 2, 5, 8, 10]
print(type(sorted_dict1)) # <class 'list'>

 

'개발 > Python' 카테고리의 다른 글

[Python] sort()의 key를 이용한 리스트 다중 정렬  (0) 2020.12.28

백준 1931번 문제를 해결하면서 리스트를 다중 정렬이 필요했다.

 

그러면 다중 정렬이란 무엇일까?? 다음과 같은 리스트가 있다고 하자.

list1 = [(5, 4), (4, 4), (4, 3), (5, 2), (3, 1), (3, 2), (2, 5), (2, 1)]

원소가 투플인 해당 리스트를 다음과 같은 조건으로 정렬하고자 한다.

투플의 첫 번째 원소에 대해서 오름차순

② 첫 번째 원소의 값이 같으면 두 번째 원소에 대해서 오름차순

 

먼저 sort()의 key에서 투플의 첫 번째 원소만을 조건으로 주면 결과는 다음과 같다.

list1.sort(key=lambda x: x[0])
# [(2, 5), (2, 1), (3, 1), (3, 2), (4, 4), (4, 3), (5, 4), (5, 2)]

첫 번째 원소에 대해서 정렬은 되지만, 두 번째 원소에 대해서는 정렬이 되지 않고 입력한 순서대로 출력이 된다.

 

따라서 조건에 맞게 정렬하기 위해서는 다음과 같이 작성하면 된다.

list1.sort(key=lambda x: (x[0], x[1]))
# [(2, 1), (2, 5), (3, 1), (3, 2), (4, 3), (4, 4), (5, 2), (5, 4)]

lambda함수에서 정렬 조건에 맞에 투플 형식으로 주면 된다. 우선순위가 높은 조건을 먼저 인자로 준다.

 

추가적인 정렬예제들

 투플의 첫 번째 원소에 대해서 오름차순

② 첫 번째 원소의 값이 같으면 두 번째 원소에 대해서 내림차순

list1.sort(key=lambda x: (x[0], -x[1]))
# [(2, 5), (2, 1), (3, 2), (3, 1), (4, 4), (4, 3), (5, 4), (5, 2)]

 

 투플의 두 번째 원소에 대해서 오름차순

번째 원소의 값이 같으면 첫 번째 원소에 대해서 오름차순

list1.sort(key=lambda x: (x[1], x[0]))
# [(2, 1), (3, 1), (3, 2), (5, 2), (4, 3), (4, 4), (5, 4), (2, 5)]

 

'개발 > Python' 카테고리의 다른 글

[Python] 딕셔너리(Dict) 정렬하기  (0) 2021.01.27

+ Recent posts