Python 딕셔너리 리스트 정렬

1 개요[ | ]

Python 딕셔너리 리스트 정렬
Python 딕셔너리 리스트 다중정렬

2 예시1: key 람다[ | ]

  • 이 방법으로 웬만한 것들은 다 유연하게 처리할 수 있다.
  • 다만, 문자열 다중정렬인데 내림차순/오름차순이 섞여 있는 것은 처리하기가 좀 어렵다.
from pprint import pprint
orders = [
  {'id': 1, 'name': 'Ashley', 'date': '2020-05-20'},
  {'id': 2, 'name': 'Peter' , 'date': '2020-05-20'},
  {'id': 3, 'name': 'Ashley', 'date': '2020-05-05'},
  {'id': 4, 'name': 'John'  , 'date': '2020-05-05'},
  {'id': 5, 'name': 'Peter' , 'date': '2020-05-05'},
]
pprint( orders )
# name 오름차순
pprint( sorted(orders, key=lambda x: x['name']) )
# name 내림차순
pprint( sorted(orders, key=lambda x: x['name'], reverse=True) )
# name, id 오름차순
pprint( sorted(orders, key=lambda x: (x['name'], x['id'])) )
# name 오름차순, id 내림차순
pprint( sorted(orders, key=lambda x: (x['name'], -x['id'])) )
# name, id 내림차순
pprint( sorted(orders, key=lambda x: (x['name'], x['id']), reverse=True) )
# name 내림차순, id 오름차순
pprint( sorted(orders, key=lambda x: (x['name'], -x['id']), reverse=True) )

3 예시2: key 함수[ | ]

from pprint import pprint

def orderBy(by, ascending=[]):
  class K:
    def __init__(self, o, *args): self.o = o
    def __lt__(self, other):
      for i, key in enumerate(by):
        asc = ascending[i] if i < len(ascending) else True
        if self.o[key] < other.o[key]: return asc
        if self.o[key] > other.o[key]: return not asc
  return K

orders = [
  {'id': 1, 'name': 'Ashley', 'date': '2020-05-20'},
  {'id': 2, 'name': 'Peter' , 'date': '2020-05-20'},
  {'id': 3, 'name': 'Ashley', 'date': '2020-05-05'},
  {'id': 4, 'name': 'John'  , 'date': '2020-05-05'},
  {'id': 5, 'name': 'Peter' , 'date': '2020-05-05'},
]

# 원본
pprint( orders )
# name 오름차순
pprint( sorted(orders, key=orderBy(['name'])) )
# name 내림차순
pprint( sorted(orders, key=orderBy(['name'],ascending=[False])) )
# name, id 오름차순
pprint( sorted(orders, key=orderBy(['name','id'])) )
# name 오름차순, id 내림차순
pprint( sorted(orders, key=orderBy(['name','id'],ascending=[True,False])) )
# name, id 내림차순
pprint( sorted(orders, key=orderBy(['name','id'],ascending=[False,False])) )
# name 내림차순, id 오름차순
pprint( sorted(orders, key=orderBy(['name','id'],ascending=[False,True])) )

4 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}