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
спасибо!
3 ответа:
>>> 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
во время одного кода операции (CALL_FUNCTION
), а вызовlambda
придется вызывать функцию, загружать различные константы(которые являются другими байт-кодами) наконец, вызовите индекс (BINARY_SUBSCR
), построитьtuple
и вернуть его... это намного больше работы для переводчика.подведем итоги:
itemgetter
сохраняет выполнение полностью наC
уровень, так что это как можно быстрее.
вот альтернативное общее решение-он сортирует элементы 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)