반응형
Python : 여러 값으로 사전 목록을 정렬하는 방법은 무엇입니까?
목록을 처음에는 값으로 정렬 한 다음 두 번째 값으로 정렬하고 싶습니다. 이 작업을 수행하는 쉬운 방법이 있습니까? 다음은 작은 예입니다.
A = [{'name':'john','age':45},
{'name':'andi','age':23},
{'name':'john','age':22},
{'name':'paul','age':35},
{'name':'john','age':21}]
이 명령은이 목록을 'name'
다음으로 정렬하는 데 사용됩니다 .
sorted(A, key = lambda user: user['name'])
하지만 어떻게이 목록을 두 번째 값으로 정렬 할 수 있습니까? 'age'
이 예 에서처럼 .
나는 'name'
다음과 같은 정렬을 원합니다 (먼저 정렬 한 다음 정렬 기준 'age'
) :
andi - 23
john - 21
john - 22
john - 45
paul - 35
감사!
>>> A = [{'name':'john','age':45},
{'name':'andi','age':23},
{'name':'john','age':22},
{'name':'paul','age':35},
{'name':'john','age':21}]
>>> sorted(A, key = lambda user: (user['name'], user['age']))
[{'age': 23, 'name': 'andi'}, {'age': 21, 'name': 'john'}, {'age': 22, 'name': 'john'}, {'age': 45, 'name': 'john'}, {'age': 35, 'name': 'paul'}]
이것은 두 속성의 튜플을 기준으로 정렬되며 다음은 동일하며 훨씬 빠르고 깔끔합니다.
>>> from operator import itemgetter
>>> sorted(A, key=itemgetter('name', 'age'))
[{'age': 23, 'name': 'andi'}, {'age': 21, 'name': 'john'}, {'age': 22, 'name': 'john'}, {'age': 45, 'name': 'john'}, {'age': 35, 'name': 'paul'}]
댓글에서 : @Bakuriu
나는 둘 사이에 큰 차이가 없다고 확신하지만
itemgetter
키를 추출하고tuple
단일 opcode (CALL_FUNCTION
) 동안 만들기 때문에 약간의 오버 헤드를 피할 수 있으며 , 호출하는 동안lambda
함수를 호출하고 다양한 상수를로드해야합니다. 다른 바이트 코드) 마지막으로 아래 첨자 (BINARY_SUBSCR
)를 호출하고 빌드tuple
하고 반환합니다. 이것은 인터프리터에게 훨씬 더 많은 작업입니다.
요약하면 itemgetter
, 실행을 C
수준에서 완전히 유지 하므로 가능한 한 빠릅니다.
from operator import itemgetter
sorted(your_list, key=itemgetter('name', 'age'))
다음은 대체 일반 솔루션입니다. 키와 값으로 dict의 요소를 정렬합니다. 장점-키를 지정할 필요가 없으며 일부 사전에서 일부 키가 누락 되어도 작동합니다.
def sort_key_func(item):
""" helper function used to sort list of dicts
:param item: dict
:return: sorted list of tuples (k, v)
"""
pairs = []
for k, v in item.items():
pairs.append((k, v))
return sorted(pairs)
반응형
'developer tip' 카테고리의 다른 글
node.js에서 마지막으로 수정 된 파일 날짜 (0) | 2020.11.30 |
---|---|
iOS 창의 루트 뷰 컨트롤러 변경 (0) | 2020.11.30 |
HTML-속성 대 속성 (0) | 2020.11.30 |
카메라 롤 액세스 권한 요청 (0) | 2020.11.29 |
사용 가능한 메모리 C ++ / g ++를 얻는 방법은 무엇입니까? (0) | 2020.11.29 |