如何在Python中按字典值对字典列表进行排序?

时间:2020-03-05 18:56:06  来源:igfitidea点击:

我得到了一个字典列表,并希望按该字典的值对其进行排序。

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

按名称排序,应成为

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

解决方案

回答

我们必须实现自己的比较功能,该功能将通过名称键的值比较字典。请参阅从PythonInfo Wiki对Mini-HOW TO进行排序

回答

我想你的意思是:

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

排序如下:

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

回答

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

... IMO的lambda比operator.itemgetter更容易理解,但是YMMV。

回答

使用密钥而不是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)

回答

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

'key'用于按任意值排序,'itemgetter'将该值设置为每个项目的'name'属性。

回答

我们可以使用自定义比较函数,也可以传入一个计算自定义排序键的函数。通常这样做效率更高,因为每个项只计算一次密钥,而比较函数将被调用多次。

我们可以这样进行:

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

但是标准库包含用于获取任意对象项的通用例程:" itemgetter"。因此,请尝试以下操作:

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

回答

import operator

要按key ='name'对词典列表进行排序:

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

要按key ='age'对字典列表进行排序:

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

回答

这是我对有关按多列排序的一个相关问题的回答。它也适用于简并情况,即列数仅为一。

回答

如果要按多个键对列表进行排序,则可以执行以下操作:

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

它相当骇人,因为它依赖于将值转换为单个字符串表示形式进行比较,但是它对于包括负数在内的数字也可以按预期工作(尽管如果使用数字,则需要使用零填充来适当格式化字符串)