이번엔 딕셔너리를 요소로 가지고 있는 리스트가 있을 때, 해당 리스트를 딕셔너리의 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를 처음 접하신 분이라면, 바로 이해되지 않는 게 당연합니다. 아래의 게시글을 읽어본다면, 조금 더 쉽게 이해할 수 있습니다.
2) lambda 함수 이용 - 사전 순 정렬
sorted(li , key= lambda x: x['name'])
sorted함수에 li를 인자로 넣고, key에 lambda함수를 넣습니다. 여기서 key는 sorted함수가 제공하는 매개변수로, custom function을 넣어주면, 그 함수를 기준으로 정렬해줍니다. 여기선 x에 대해 x['name']을 기준으로 정렬하도록 lambda를 이용해 custom function을 만들었습니다. 즉, 각 딕셔너리에 대해 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보다 더 짧게 쓸 수 있으며, 성능 역시 약간 더 빠릅니다.
* 출력
*성능 비교
리스트 안에 딕셔너리가 약 2백만 개 정도 있을 때, lambda를 이용한 정렬은 약 177ms가 걸리지만, itemgetter를 이용한 경우 약 149ms가 걸리는 것으로 측정되었습니다. (환경에 따라 다를 수 있습니다.)
감사합니다.
오늘도 발전하는 여러분을 응원합니다!
다음에 더 유익하고 재미있는 글로 찾아오겠습니다.
* 위 실습 코드와 실행결과는 아래 링크에서 보실 수 있습니다.
Reference)
https://stackoverflow.com/questions/72899/how-do-i-sort-a-list-of-dictionaries-by-a-value-of-the-dictionary
'Programming > Python 꿀팁' 카테고리의 다른 글
[Python] 유용한 새로운 연산자! 바다코끼리 연산자 := (walrus operator) (0) | 2022.04.08 |
---|---|
[Python] 현재시간 출력 및 포맷팅 방법 (time, datetime library) (0) | 2022.04.04 |
[Python] 순서 유지하며 두 리스트 교집합 구하기 (리스트컴프리핸션) (2) | 2022.03.22 |
[Python] 문자열을 코드로 (eval, exec 사용법) (0) | 2021.07.27 |
[Python] 코드 병렬처리 (백그라운드 실행) (0) | 2020.12.15 |