2012-01-29 129 views
3

此线程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 

我尝试了这个和各种版本无济于事。

任何帮助表示赞赏,

+0

这实际上对我的作品。你确定你输入了'[{'name':'Homer','age':39},{'name':'Bart','age':10}]'? [虽然我会根据元组排序,而不是字符串。更简单,更不容易出错 - 比方说有一个100岁的人。] – DSM 2012-01-29 18:47:39

+0

非常好的Python维基文档:[Sorting Mini-How to](http://wiki.python.org/moin/HowTo/Sorting) – reclosedev 2012-01-29 18:53:36

回答

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'}] 
+0

伟大的答案谢谢。 – dublintech 2012-01-29 19:08:58

+0

'operator.itemgetter('age','name')'好得多...... – JBernardo 2012-01-29 19:57:41

+0

@JBernardo:好点,回答更新。谢谢。 – NPE 2012-01-29 20:00:34

相关问题