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

我有一个词典列表,希望每个项目都按特定的属性值排序。

考虑下面的数组,

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

name排序时,应成为

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

答案

使用密钥而不是 cmp 看起来更干净:

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

或如 JFSebastian 和其他人所建议的,

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

通过 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':'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'])

…lambda 比operator.itemgetter更容易理解,但比 YMMV 更容易理解。

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

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

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

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

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

a = [{'name':'Homer', 'age':39}, ...]

# This changes the list a
a.sort(key=lambda k : k['name'])

# This returns a new list (a is not modified)
sorted(a, key=lambda k : k['name'])

我想你的意思是:

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

排序如下:

sorted(l,cmp=lambda x,y: cmp(x['name'],y['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'))

使用 Perl 的 Schwartzian 变换,

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

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

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

有关Perl Schwartzian 变换的更多信息

在计算机科学中,Schwartzian 变换是一种 Perl 编程习惯用法,用于提高对项目列表进行排序的效率。当排序实际上是基于元素的某个属性(键)的排序时,此惯用法适用于基于比较的排序,其中计算该属性是一项应执行最少次数的密集操作。 Schwartzian 转换的显着之处在于它不使用命名的临时数组。

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