2012-06-21 38 views
2
dic = {'Tea': 35, 'Coffee': 35, 'Chocolate': 10} 

我想按降序排序字典的值,但我怎樣才能訪問鍵?如何使用值對字典進行排序並且還能夠訪問鍵

示例代碼:

for x in sorted(dic.values()): 
    print(key, dic[key]) 

我也很喜歡輸出可以按字母者皆當值相等排序。

預期輸出:

Coffee 35 
Tea 35 
Chocolate 10 
+3

提示:請看'.items()'方法。 –

+3

您可以編輯您的問題以顯式聲明排序順序您正在尋找?這聽起來像你想先按降序對值進行排序,然後按字母順序按名稱排序。是對的嗎? – senderle

回答

9

你想要的是the dict.items() method,它提供了(key, value)元組。

若要按值排序,那麼你用一個key方法,在這種情況下,operator.itemgetter()從元組取第二個值進行排序,然後將reverse屬性,讓他們在你想要的順序。

>>> from operator import itemgetter 
>>> dic={'Tea': 35, 'Coffee': 35, 'Chocolate': 10} 
>>> for key, value in sorted(dic.items(), key=itemgetter(1), reverse=True): 
...  print(key, value) 
... 
Tea 35 
Coffee 35 
Chocolate 10 

編輯:如果您想通過鍵作爲輔助排序排序,我們可以簡單地通過數值的元組,以及Python將排序的第一個值,然後第二個,等等......唯一的問題正在使用反向意味着我們將它們按錯誤順序排列。作爲一個黑客,我們簡單地使用值的負版本排序無反向:

>>> for key, value in sorted(dic.items(), key=lambda x: (-x[1], x[0])): 
...  print(key, value) 
... 
Coffee 35 
Tea 35 
Chocolate 10 
+0

你的答案返回'茶35咖啡35巧克力10'。 –

+1

@ user1374499您從未爲具有相同值的項目定義訂單,在這種情況下應該應用什麼規則?我假設字母基於關鍵。 –

+0

我發佈了問題所需的輸出。 –

7

一個選項:

for key in sorted(dic, key=dic.get, reverse=True): 
    print(key,dic[key]) 

這個排序字典的鍵,但使用dic.get的關鍵功能,通過價值從而有效地排序。你的示例輸出表明你想按降序排序,所以我包括reverse=True

編輯如果您的字典值實際上是計數,您可以考慮使用collections.Counter而不是dicitonary。該課程有一個方法most_common(),它以所需順序返回項目。

+1

雖然這可行,但確實意味着您必須從字典中檢索兩次值。雖然這是字典上的快速操作,但它仍然有點不雅。 –

+0

它返回'茶35 咖啡35 巧克力10',這是我所期望的不同。 –

+0

@Lattyware我同意你所說的,但這比你的方法簡單得多。使用'key = itemgetter(1)'不如這個imo清晰。 – jamylak

1

其他的答案這表明dict.items()是部分正確。但是,如果你想在排序過程中包含關鍵字(如果我理解你是正確的),你想要顛倒這些項目(其實質上是一個元組(key, value))。所以請使用

data={'Tea': 35, 'Coffee': 35, 'Chocolate': 10} 
for item in sorted(dic.items(), key=lambda it: (-it[1], it[0])): 
    print item 

key參數給出了用於分揀項目的功能。它將項目轉換爲一個密鑰,然後真正用於排序。

在你的情況,你想有一個混合升/降排序,所以這裏提供的項目首先變成

(-35, 'Coffee') 
(-35, 'Tea') 
(-10, 'Chocolate') 

,並依次打印。 (替換過程僅僅用於排序目的,實際返回的項目是原始的。)

+0

這是行不通的 - 一方面,它會從最小到最高,爲兩個,lambda只會得到一個參數。 –

+0

請不要太快用downvoting。 :-)我現在糾正它。 – glglgl

+0

是的,但現在它只是我的答案的重複。 –

相關問題