본문 바로가기
프로그래밍 언어/Python 3

[Python 3] dictionary list sorting

by Physics 2020. 12. 20.
728x90

문제 상황: 

다음과 같은 성적 데이터가 있다고 가정을 하자. 

name age English Math Science
Alice 20 60 35 63
Cathy 21 70 59 43
Duke 19 80 44 98
Tommy 17 65 80 56
Joy 20 40 50 34
Kate 22 50 100 80


위 데이터를 python 내에서 dictionary의 형태로 표현을 하면 아래와 같다.  
  • key: name, age, English, Math, Science

score_data = [
    {'name':'Alice', 'age':20, 'English':60, 'Math':35 , 'Science':63},
    {'name':'Cathy', 'age':21, 'English':70, 'Math':59 , 'Science':43},
    {'name':'Duke' , 'age':19, 'English':80, 'Math':44 , 'Science':98},
    {'name':'Tommy', 'age':17, 'English':65, 'Math':80 , 'Science':56},
    {'name':'Joy'  , 'age':20, 'English':40, 'Math':50 , 'Science':34},
    {'name':'Kate' , 'age':22, 'English':50, 'Math':100, 'Science':80}
             ]

 

이때, 각각의 key값에 따라 정렬(sort)을 하려고 한다. 


해결방법

sorted() 함수를 사용하여 정렬한다. 이때, key= 옵션을 사용하여 정렬하며, 다음과 같이 두 가지 방법을 이용할 수 있다.
  (1) lambda 함수 이용
  (2) operator.itemgetter() 사용 

1. lambda 함수 이용

  1) 키 값 하나만을 기준으로 정렬하는 경우

sorted(<dict_list>, key = lambda x: x["key_name"])

  • <dict_list> : 정렬하고자 하는 딕셔너리 데이터 셋 
  • "key_name": 정렬하려고 기준을 잡은 키의 이름, ex) 위의 예제의 경우, "name", 'age', 'English', 'Math', 'Science'
  • 오름차순으로 정렬하며, 내림차순으로 정렬하는 경우, reverse=True 옵션을 사용한다. 

  2) 정렬할 key 값이 여러 개인 경우 

sorted(<dict_list>, key = lambda x: (x["key_name_1"], x["key_name_2"]))

  • key_name_1을 먼저 오름차순으로 정렬 후, key_name_2로 오름차순으로 정렬함 
  • key_name_1을 내림차순을 하는 경우, -x["key_name_1"]으로 "-"를 붙여줌  

 

2. operator.itemgetter() 사용

   1) 정렬할 key 값이 하나인 경우 

import operator 
sorted(<dict_list>, key = operator.itemgetter("<key_name>"))

 

   2) 정렬할 key 값들이 여러 개인 경우 

import operator 
sorted(<dict_list>, key = operator.itemgetter("<key_name_1>", "<key_name_2>"))

 

ex - 1) 'Math' 키로 오름차순으로 정렬하는 경우

>>> sorted(score_data, key = lambda x: x['Math'])
[{'name': 'Alice', 'age': 20, 'English': 60, 'Math': 35, 'Science': 63},
 {'name': 'Duke', 'age': 19, 'English': 80, 'Math': 44, 'Science': 98},
 {'name': 'Joy', 'age': 20, 'English': 40, 'Math': 50, 'Science': 34},
 {'name': 'Cathy', 'age': 21, 'English': 70, 'Math': 59, 'Science': 43},
 {'name': 'Tommy', 'age': 17, 'English': 65, 'Math': 80, 'Science': 56},
 {'name': 'Kate', 'age': 22, 'English': 50, 'Math': 100, 'Science': 80}]

 

Reference: 
[1] www.geeksforgeeks.org/ways-sort-list-dictionaries-values-python-using-lambda-function/  
[2] hello-bryan.tistory.com/43 

728x90

댓글