2012-03-24 102 views
6

我需要得到一個字典的排序表示,按照值的降序排列(首先顯示字典中的最大值)。使用排序的內置函數排序python字典的值

樣本:

mydict={u'jon':30,u'den':26,u'rob':42,u'jaime':31} 

我需要向他們展示像

rob=42 
jaime=31 
jon=30 
den=28 

我想這

from operator import itemgetter 
sortedvalues=sorted(mydict,key=itemgetter(1)) 

當我打印的清單,我得到

[u'jaime', u'den', u'rob', u'jon'] 

此列表無序!我是否錯過了有關內置排序的用法?還是我不正確地使用itemgetter?

回答

11

這是一個有趣的問題,因爲你並沒有引起這樣的錯誤,你將有鑰匙是否被另一種非可索引類型(比如整數),這是由於一個微妙的一系列的事情:

  1. 排序(mydict,...)試圖遍歷字典使用的iter(mydict)等效它將調用mydict.__iter__()
  2. 迭代字典產生其,在效果iter(mydict)相同mydict.iterkeys()
  3. 您的密鑰是字符串,由於字符串是可索引的,因此itemgetter(1)將對字符串值起作用,從而獲取字符串中的第二個字符。

如果任何字符串的長度爲1個字符,那麼您使用的代碼將失敗並導致IndexError,那麼您只能幸運了。 (或沒有,取決於你如何看待它,因爲得到IndexError會讓你更快意識到這個問題。)

你想做的事,如果你只想要的值是什麼:

sorted(mydict.values(), reverse=True) 

如果你想要的按鍵以及成對的,你想

sorted(mydict.iteritems(), key=itemgetter(1), reverse=True) 
+1

我意識到,閱讀這個響應之前!並改爲mydict.iteritems()..感謝您的幫助 – 2012-03-24 04:57:23

+0

什麼時候應該使用dict.iteritems()而不是dict.items()? – 2012-03-24 05:00:04

+1

如果您只需要鍵:'sorted(mydict,key = mydict.get,reverse = True)' – 2012-03-24 05:33:25

5

它們按名稱中的第二個字母排序;遍歷一個字典產生它的鍵。

sorteditems = sorted(mydict.iteritems(), key=itemgetter(1)) 
3

遍歷字典(這是什麼sorted功能)只會給你它的關鍵:

>>> sorted(mydict) 
[u'den', u'jaime', u'jon', u'rob'] 

而是你希望這兩個鍵和值排序 - 要做到這一點,你可以使用mydict.items()(或mydict.iteritems(),這與大類型的字典更有效):

>>> sorted(mydict.items()) 
[(u'den', 26), (u'jaime', 31), (u'jon', 30), (u'rob', 42)] 

然後按照預期的代碼將工作:

>>> from operator import itemgetter 
>>> sorted(mydict.items(), key = itemgetter(1)) 
[(u'den', 26), (u'jon', 30), (u'jaime', 31), (u'rob', 42)] 

您可能還需要進行排序與​​作爲輔助排序值的字典的關鍵,如果多個鍵具有相同的值:

>>> mydict={u'a': 1, 'z': 1, 'd': 1} 
>>> sorted(mydict.items(), key = itemgetter(1)) 
[(u'a', 1), ('z', 1), ('d', 1)] 
>>> sorted(mydict.items(), key = itemgetter(1, 0)) 
[(u'a', 1), ('d', 1), ('z', 1)]