2012-01-29 143 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

相關問題