Вопрос: Как отсортировать список словарей по значениям словаря в Python?


Я получил список словарей и хочу, чтобы это было отсортировано по значению этого словаря.

Эта

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

сортировка по имени, должна стать

[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]

1307


источник


Ответы:


Он может выглядеть более чистым с использованием ключа вместо cmp:

newlist = sorted(list_to_be_sorted, key=lambda k: k['name']) 

или как J.F.Sebastian и другие предложили,

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name')) 

Для полноты (как указано в комментариях fitzgeraldsteele), добавьте reverse=Trueсортировать по убыванию

newlist = sorted(l, key=itemgetter('name'), reverse=True)

1770



import operator

Чтобы отсортировать список словарей по ключу = 'name':

list_of_dicts.sort(key=operator.itemgetter('name'))

Чтобы отсортировать список словарей по ключу = «возраст»:

list_of_dicts.sort(key=operator.itemgetter('age'))

108



Если вы хотите отсортировать список по нескольким клавишам, вы можете сделать следующее:

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']))

Он довольно хакерский, поскольку он полагается на преобразование значений в одно строковое представление для сравнения, но он работает так, как ожидалось, для чисел, включая отрицательные (хотя вам нужно будет правильно форматировать строку с нулевыми прокладками, если вы используете числа)


38



my_list = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

my_list.sort(lambda x,y : cmp(x['name'], y['name']))

my_listтеперь будет то, что вы хотите.

(3 года спустя) Отредактировано для добавления:

Новый keyаргумент более эффективен и опрятен. Теперь лучший ответ выглядит так:

my_list = sorted(my_list, key=lambda k: k['name'])

... лямбда, ИМО, легче понять, чем operator.itemgetter, но YMMV.


25



import operator
a_list_of_dicts.sort(key=operator.itemgetter('name'))

«key» используется для сортировки по произвольному значению, а «itemgetter» устанавливает значение для атрибута «name» каждого элемента.


19



Думаю, вы имели в виду:

[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

Это будет отсортировано следующим образом:

sorted(l,cmp=lambda x,y: cmp(x['name'],y['name']))

13



You could use a custom comparison function, or you could pass in a function that calculates a custom sort key. That's usually more efficient as the key is only calculated once per item, while the comparison function would be called many more times.

You could do it this way:

def mykey(adict): return adict['name']
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=mykey)

But the standard library contains a generic routine for getting items of arbitrary objects: itemgetter. So try this instead:

from operator import itemgetter
x = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10}]
sorted(x, key=itemgetter('name'))

12



Using Schwartzian transform from Perl,

py = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]

do

sort_on = "name"
decorated = [(dict_[sort_on], dict_) for dict_ in py]
decorated.sort()
result = [dict_ for (key, dict_) in decorated]

gives

>>> result
[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]

More on Perl Schwartzian transform

In computer science, the Schwartzian transform is a Perl programming idiom used to improve the efficiency of sorting a list of items. This idiom is appropriate for comparison-based sorting when the ordering is actually based on the ordering of a certain property (the key) of the elements, where computing that property is an intensive operation that should be performed a minimal number of times. The Schwartzian Transform is notable in that it does not use named temporary arrays.


12