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

时间:2012-01-29 18:43:13

标签: python

这个帖子How do I sort a list of dictionaries by values of the dictionary in 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

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

任何帮助表示赞赏,

1 个答案:

答案 0 :(得分: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'}]