我有一个词典列表,希望每个项目都按特定的属性值排序。
考虑下面的数组,
[{'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 进行排序