요약

사용법만 알고 싶다면 아래 코드블럭 참고!

1
2
3
4
5
6
7
8
9
10
11
# (1) key 기준 오름차순 정렬
sorted_dict = sorted(origin_dict, key=lambda x:x[0])

# (2) key 기준 내림차순 정렬
sorted_dict = sorted(origin_dict, key=lambda x:x[0], reverse=True)

# (3) value 기준 오름차순 정렬
sorted_dict = sorted(origin_dict, key=lambda x:x[1])

# (4) value 기준 내림차순 정렬
sorted_dict = sorted(origin_dict, key=lambda x:x[1], reverse=True)

딕셔너리 정렬하기

딕셔너리 정렬에 사용되는 기술

딕셔너리 정렬에는 총 3개의 기술이 혼합되어 작동합니다. 따라서 이 3개의 기술의 원리를 파악하면, 앞으로 딕셔너리 정렬하는 방법을 잘 기억할 수 있을 것입니다.

(1) sorted 함수
(3) dict.items() 튜플 형식 이터레이터
(2) lambda 함수 (익명 함수)

sorted 함수

sorted 함수는 정렬 기능을 가진 함수로, 문자열, 튜플, 리스트, 사전과 같은 이터러블을 받아서 정렬된 리스트로 반환하는 기능을 가지고 있습니다.

파라미터는 2가지로 key, reverse 입니다. key 파라미터는 정렬 대상인 이터러블 객체에서 정렬의 기준이 될 값을 뜻합니다. 기본값은 None 입니다.

reverse 파라미터는 내림차순으로 여부를 결정하는 파라미터로 기본값은 False 입니다. True로 선언시 내림차순으로 정렬됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 정렬 대상에 따른 예시

# 리스트 정렬
ex_list = [1, 3, 2, 5, 4]
print(sorted(ex_list))
>> [1, 2, 3, 4, 5]

# set(집합) 정렬
ex_set = {1, 3, 2, 5, 4}
print(sorted(ex_set))
>> [1, 2, 3, 4, 5]

# 문자열 정렬
ex_txt = '파이썬 딕셔너리 정렬'
print(sorted(ex_txt))
>> [' ', ' ', '너', '딕', '렬', '리', '셔', '썬', '이', '정', '파']

# range 객체 정렬
ex_range = range(1, 6)
print(sorted(ex_range))
>> [1, 2, 3, 4, 5]

key 옵션은 이터러블 객체의 정렬 기준값을 지정합니다. 기준값을 지정할 때에는 함수로 구성을 해야합니다. 말로 설명이 조금 어려운데, 아래 예시를 참고하면 좋습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# key 파라미터 사용
ex_tuple_list = [(1, 4, 6), (2, -1), (4, 3), (0, -2, 3), (9, -1, 1, 1, 2, 5)]

# 이터러블 내 개체의 첫 번째 원소 값을 뽑는 함수
def get_first(itr):
    return itr[0]

# " 두 번째 원소 값을 뽑는 함수
def get_second(itr):
    return itr[1]

# key 파라미터를 사용한 정렬 (1) 첫 번째 원소 값 기준
print(sorted(ex_tuple_list, key=get_first))
>> [(0, -2, 3), (1, 4, 6), (2, -1), (4, 3), (9, -1, 1, 1, 2, 5)]

# key 파라미터를 사용한 정렬 (2) 두 번째 원소 값 기준
print(sorted(ex_tuple_list, key=get_second))
>> [(0, -2, 3), (2, -1), (9, -1, 1, 1, 2, 5), (4, 3), (1, 4, 6)]

reverse 옵션은 정렬을 오름차순으로 할지 내림차순으로 할지 정하는 옵션입니다. True 일 경우 내림차순, False 일 경우 오름차순이며, 기본값은 False 입니다.

1
2
3
4
5
6
7
8
9
ex_list = [1, 3, 2, 5, 4]

# 리스트 정렬 (오름차순)
print(sorted(ex_list))
>> [1, 2, 3, 4, 5]

# 리스트 정렬 (내림차순)
print(sorted(ex_list, reverse=True))
>> [1, 2, 3, 4, 5]

dict.items()

dict.items() 는 딕셔너리의 key - value 쌍들을 튜플 형태로 반환하는 이터러블 객체를 생성하는 함수입니다. 조금 더 쉽게 말하면, 딕셔너리의 모든 key - value 쌍을 튜플로 변환해 리스트와 같이 순서가 있는 객체에 담아 반환하는 함수인 것이죠.

1
2
3
data = {'1':'Apple', '2':'Cherry', '3':'Banana'}
print(data.items())
>> dict_items([('1', 'Apple'), ('2', 'Cherry'), ('3', 'Banana')])

for문을 사용해서 출력해보면 데이터구조를 조금 더 자세히 알아볼 수 있습니다.

1
2
3
4
5
6
7
data = {'1':'Apple', '2':'Cherry', '3':'Banana'}
for item in data.items():
    print(item)

>> ('1', 'Apple')
>> ('2', 'Cherry')
>> ('3', 'Banana')

이렇게 key-value 쌍을 튜플로 묶는다면, 앞서 살펴본 sorted 함수를 통해 정렬하는 것도 가능해집니다.

1
2
3
4
5
6
7
data = {'1':'Apple', '2':'Cherry', '3':'Banana'}

def get_second(itr):
    return itr[1]

print(sorted(data.items(), key=get_second))
>> [('1', 'Apple'), ('3', 'Banana'), ('2', 'Cherry')]

lambda 함수

lambda 함수는 “익명 함수”라고도 불리우는 함수 사용 방법입니다. 일반적으로 간단한 연산을 수행하거나 임시로 함수를 만들어 사용할 때 유용합니다. lambda 의 기본 구조는 아래와 같습니다.

1
lambda 파라미터:반환값

예시로 파라미터로 두 개의 숫자가 주어질 경우 두 수를 더하는 함수를 정의하고 사용해보겠습니다.

1
2
3
4
5
6
7
8
9
10
# 일반적인 함수 선언 사용
def add(a, b):
    return a + b
print(add(1, 2))
>> 3

# lambda 함수 사용
add = lambda a, b:a+b
print(add(1, 2))
>> 3

일반적인 함수 사용 방법보다는 조금 간단해진 선언 방식을 볼 수 있습니다. 하지만 이정도 가지고 굳이 lambda 함수를 사용하는 건.. 조금 납득이 어렵죠. lambda 는 굳이 메모리에 올리지 않아도 되는 일회성 함수를 사용할 때 그 진가가 발휘됩니다. 예시로 앞서 사용한 sorted + dict.items() 를 이용한 딕셔너리 정렬을 일반적인 함수 선언 방법을 썼을 경우와 lambda를 썼을 경우 두 가지를 진행해보겠습니다. 어떤 차이가 있는지 살펴보시죠.

1
2
3
4
5
6
7
8
9
10
# 일반적인 함수 선언 사용시
## 정렬할 dict
data = {'1':'Apple', '2':'Cherry', '3':'Banana'}

## 일반적인 함수 선언 사용
def get_second(itr):
    retrun itr[1]

## sorting
print(sorted(data.items(), key=get_second))
1
2
3
4
5
6
# lambda 함수 사용시
## 정렬할 dict
data = {'1':'Apple', '2':'Cherry', '3':'Banana'}

## sorting
print(sorted(data.items(), key=lambda x:x[1]))

두 코드블럭으 출력값은 모두 [('1', 'Apple'), ('3', 'Banana'), ('2', 'Cherry')] 로 동일합니다. 하지만 lambda 함수는 미리 선언을 하지 않아도 되므로 사용상 간편하고, 코드의 간결성을 유지하며, 또한 메모리의 절약도 가능합니다.

Outro

오늘은 파이썬에서 딕셔너리를 정렬하는 방법, 그리고 그 원리에 대해 알아보았습니다. 원리를 알고 사용하는 것과 원리를 모르고 사용하는 것은, 단순히 구문을 기억하느냐 마느냐의 차이를 넘어서, 지식의 확장과 응용력 향상에도 큰 차이를 가져옵니다. 프로그래밍에서 특정 기능을 사용할 때, 그 기능의 기저에 깔려 있는 원리를 탐구하는 습관을 들이면 더 깊은 이해와 창의적인 문제 해결 능력을 기를 수 있도록 앞으로도 노력해야겠습니다.

Reference

파이썬 딕셔너리 정렬
sorted() 데이터 정렬
sorted 함수 흉내내기
파이썬 iterable(이터러블) 데이터 타입(자료형)