[Python] 딕셔너리 리스트 Key 순서 정렬 (sort list of dictionary)

반응형

Python Logo

 

이번엔 딕셔너리를 요소로 가지고 있는 리스트가 있을 때, 해당 리스트를 딕셔너리의 key값을 기준으로 정렬하는 방법에 대해 알아보겠습니다.


 

*전체 코드

li = [{'name':'Ace', 'age':87}, {'name':'Bella', 'age':10}]
# name을 기준으로 사전순 정렬
print(sorted(li , key= lambda x: x['name']))
## Output : [{'name': 'Ace', 'age': 87}, {'name': 'Bella', 'age': 10}]
# name을 기준으로 사전 역순으로 정렬
print(sorted(li , key= lambda x: x['name'], reverse=True))
## Output : [{'name': 'Ace', 'age': 87}, {'name': 'Bella', 'age': 10}]
from operator import itemgetter
# itemgetter이용 name 기준으로 사전순 정렬
print(sorted(li, key=itemgetter('name')))
## Output : [{'name': 'Ace', 'age': 87}, {'name': 'Bella', 'age': 10}]
# age 기준으로 사전순 정렬 (숫자도 가능)
print(sorted(li, key=itemgetter('age')))
## Output : [{'name': 'Bella', 'age': 10}, {'name': 'Ace', 'age': 87}]

 

사용할 리스트 정의

li = [{'name':'Ace', 'age':87}, {'name':'Bella', 'age':10}]

리스트에 2개의 딕셔너리가 들어있습니다. 각 딕셔너리는 name과 age라는 key값을 가지고 있습니다.

 

1. lambda 함수 이용 정렬

1) lambda 함수란?

lambda함수는 기초적인 연산을 하는 간단한 함수를 만들 때 쓰입니다. lambda 인자: 인자의 연산과 같은 방식으로 쓰입니다. 인자를 입력받아 인자의 연산을 return으로 주는 함수로 보면 되겠습니다. lambda를 처음 접하신 분이라면, 바로 이해되지 않는 게 당연합니다. 아래의 게시글을 읽어본다면, 조금 더 쉽게 이해할 수 있습니다.

[Python] map 함수란? 활용법(lambda)

 

2) lambda 함수 이용 - 사전 순 정렬

sorted(li , key= lambda x: x['name'])

sorted함수에 li를 인자로 넣고, key에 lambda함수를 넣습니다. 여기서 key는 sorted함수가 제공하는 매개변수로, custom function을 넣어주면, 그 함수를 기준으로 정렬해줍니다. 여기선 x에 대해 x['name']을 기준으로 정렬하도록 lambda를 이용해 custom function을 만들었습니다. 즉, 각 딕셔너리에 대해 name 키의 값을 기준으로 정렬합니다.

* 출력

key= lambda x: x['name']

 

3) lambda 함수 이용 - 사전 역순 정렬

sorted(li , key= lambda x: x['name'], reverse=True)

위와 모두 동일한 상태에서, sorted함수에 reverse=True를 추가했습니다. 사전 역순으로 정렬하도록 하는 기능입니다. reverse 매개변수의 기본값은 False이며, 사전 순 정렬을 의미합니다.

*출력

사전 역순

 

2. itemgetter이용 정렬

1) itemgetter 란?

파이썬 내장 라이브러리인 operator의 메서드 중 하나로, 주로 정렬에 쓰이는 함수입니다. 말 그대로 item을 얻어다 주는 함수입니다. itemgetter의 인자로 key값을 주면, 딕셔너리에 대해 해당 key의 value를 얻어다 줍니다.

 

2) itemgetter 이용 - 사전 순 정렬

from operator import itemgetter
sorted(li, key=itemgetter('name'))

sorted함수의 key 매개변수에 itemgetter('name')을 넣어줍니다. 위와 마찬가지로, 리스트 안의 각 딕셔너리에 대해, 'name'의 value를 기준으로 사전 순으로 정렬해 줍니다. lambda보다 더 짧게 쓸 수 있으며, 성능 역시 약간 더 빠릅니다.

* 출력

itemgetter 사용

 

*성능 비교

리스트 안에 딕셔너리가 약 2백만 개 정도 있을 때, lambda를 이용한 정렬은 약 177ms가 걸리지만, itemgetter를 이용한 경우 약 149ms가 걸리는 것으로 측정되었습니다. (환경에 따라 다를 수 있습니다.)

comparing performance

 

감사합니다.

오늘도 발전하는 여러분을 응원합니다!

다음에 더 유익하고 재미있는 글로 찾아오겠습니다.

 

 

* 위 실습 코드와 실행결과는 아래 링크에서 보실 수 있습니다.

https://github.com/netsus/python_practice/blob/master/220325_python_sorting_list_of_dictionaries.ipynb

 

GitHub - netsus/python_practice: basic python course

basic python course. Contribute to netsus/python_practice development by creating an account on GitHub.

github.com

 

Reference)
https://stackoverflow.com/questions/72899/how-do-i-sort-a-list-of-dictionaries-by-a-value-of-the-dictionary

 

반응형

댓글

Designed by JB FACTORY