如何按多个元素对字典列表进行排序

3

这个帖子如何在Python中按字典的值对字典列表进行排序?非常清晰地解释了如何对字典列表进行排序。总结一下,

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

你需要做的是:

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

然而,我的字典里有更多的元素,我需要按照其中四个元素进行排序,而不仅仅是一个。你有什么建议吗?

注意:我进一步阅读了讨论串,并看到了这个建议:

sortedlist = sorted(input, key=lambda elem: "%02d %s" % (elem['age'], elem['name']))

不起作用。它会给出错误提示:
TypeError: list indices must be intergers, not str

我尝试了各种版本,但都无济于事。

感谢任何帮助。


那对我来说实际上很有效。您确定将输入设置为 [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}] 吗?[虽然我会按元组本身排序,而不是字符串。更简单,更少出错--比如有个100岁的人。] - DSM
Python Wiki上有非常好的文档:排序小技巧 - reclosedev
1个回答

4

只需将关键函数更改为返回元组,其中包含您希望按其排序的元素:

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

例如:

In [13]: input = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}, {'name':'Milhouse', 'age':10}, {'name': 'Mr. Burns', 'age': 104}]

In [14]: sorted(input, key=lambda k: (k['age'], k['name']))
Out[14]: 
[{'age': 10, 'name': 'Bart'},
 {'age': 10, 'name': 'Milhouse'},
 {'age': 39, 'name': 'Homer'},
 {'age': 104, 'name': 'Mr. Burns'}]

你用字符串格式化的方法也可行,但是需要增加格式中数字的位数以容纳像Cornelius Chapman这样的数字。;-)
尽管如此,我建议使用元组,因为这种方法更直接地解决了问题,效率更高,并且不容易出现编码错误。
编辑:正如@JBernardo在评论中建议的那样,上述内容也可以使用operator.itemgetter()来表达:
In [19]: sorted(input, key=operator.itemgetter('age','name'))
Out[19]: 
[{'age': 10, 'name': 'Bart'},
 {'age': 10, 'name': 'Milhouse'},
 {'age': 39, 'name': 'Homer'},
 {'age': 104, 'name': 'Mr. Burns'}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接