Как отсортировать список словарей по значению словаря в Python?
Как отсортировать список словарей по значению определенного ключа?
У меня есть список словарей, который выглядит следующим образом:
[{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
Я хочу отсортировать этот список по ключу name
. Ожидаемый результат сортировки:
[{'name': 'Bart', 'age': 10}, {'name': 'Homer', 'age': 39}]
Как мне это сделать?
5 ответ(ов)
Для того чтобы отсортировать список словарей по ключу 'name'
, вы можете использовать следующую конструкцию:
list_of_dicts.sort(key=operator.itemgetter('name'))
А если вы хотите отсортировать список словарей по ключу 'age'
, то используйте:
list_of_dicts.sort(key=operator.itemgetter('age'))
Таким образом, вы сможете легко сортировать ваши словари по нужным ключам, используя модуль operator
и метод sort()
.
Ваш код для сортировки списка словарей на Python немного устарел, так как cmp
и стандартная функция sort()
с функцией сравнения не работают в Python 3. Вместо этого рекомендуется использовать аргумент key
, который более эффективен и читабелен.
Вот как это можно сделать:
my_list = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age': 10}]
my_list.sort(key=lambda x: x['name'])
В результате my_list
будет отсортирован по именам.
Также, если вы хотите создать новый отсортированный список, не изменяя оригинальный, используйте функцию sorted()
:
sorted_list = sorted(my_list, key=lambda k: k['name'])
Лямбда-функция в этом случае, на мой взгляд, легче для понимания, чем использование operator.itemgetter
, но это может зависеть от ваших предпочтений.
Если вы хотите отсортировать список по нескольким ключам, вы можете сделать следующее:
my_list = [{'name': 'Homer', 'age': 39}, {'name': 'Milhouse', 'age': 10}, {'name': 'Bart', 'age': 10}]
sortedlist = sorted(my_list, key=lambda elem: "%02d %s" % (elem['age'], elem['name']))
Хотя это решение можно считать немного "костыльным", так как оно зависит от преобразования значений в одну строку для сравнения, оно тем не менее работает, как ожидается, даже для чисел, включая отрицательные (обратите внимание, что если вы используете числа, нужно правильно отформатировать строку с нулями).
В вашем примере a
— это список словарей, где каждый словарь содержит информацию о персонаже (имя и возраст).
Первый способ, который вы используете:
a.sort(key=lambda k: k['name'])
Этот метод изменяет сам список a
на месте и сортирует его по имени персонажа. То есть, после выполнения этой строки, список a
будет отсортированный, и никаких новых списков не создается.
Второй способ:
sorted(a, key=lambda k: k['name'])
Этот метод возвращает новый отсортированный список, при этом исходный список a
остается без изменений. Если вы хотите сохранить отсортированный результат, вам необходимо присвоить его новой переменной:
sorted_list = sorted(a, key=lambda k: k['name'])
Таким образом, разница между sort()
и sorted()
заключается в том, что первый метод изменяет оригинальный список, а второй — создает новый список без изменения оригинала.
В данном коде используется метод sort()
для сортировки списка словарей (a_list_of_dicts
). Параметр key
позволяет задать, по какому критерию будет происходить сортировка, в данном случае — по произвольному значению. Функция operator.itemgetter('name')
извлекает значение по ключу 'name'
из каждого словаря, что и задает критерий сортировки. Таким образом, список будет отсортирован по имени, которое хранится в каждом словаре.
В чем разница между методами append и extend для списков в Python?
Как вернуть ключи словаря в виде списка в Python?
Создание словаря (dict) из отдельных списков ключей и значений
Как отсортировать список объектов по атрибуту объектов?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе