developer tip

Python : 여러 값으로 사전 목록을 정렬하는 방법은 무엇입니까?

optionbox 2020. 11. 30. 08:03
반응형

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)

참고 URL : https://stackoverflow.com/questions/16082954/python-how-to-sort-a-list-of-dictionaries-by-several-values

반응형