2012-03-13 85 views
1

我需要從字典中獲取最大值的幫助。我有{num:[state,value] ...}的字典,並且需要獲取與最高值關聯的所有內容。搜索字典獲取最大值,然後獲取關聯密鑰

#find max value in dictionary 
td = {0: ['b',3], 1: ['b',6], 4: ['b',2], 3: ['b',5] } 
#In this example td dict, I want to grab the key and state associated with the highest value, 6. I want to grab "1: ['b',6]" 
print td 
print td.keys() 
print td.values() 
maxval = max([v for k,[s,v] in td.iteritems()]) 
print maxval #correctly prints 6 
+0

你確定只有一個(k,s,v)三元組達到最大值v嗎? – DSM 2012-03-13 23:45:48

回答

5

只要改變你的max()理解與價值作爲第一要素,產生的元組:

>>> max((v, k, s) for k, (s, v) in td.iteritems()) 
(6, 1, 'b') 

所以你的代碼可能是這個樣子:

maxval, maxnum, maxstate = max((v, k, s) for k, (s, v) in td.iteritems()) 
+0

+1,但我認爲你應該解釋'魔術'(關於元組的元素順序) – wim 2012-03-13 23:43:22

+0

好的太棒了!所以max()查看元組/列表中的第一個元素。 k,(s,v)和k,[s,v]之間有什麼區別?我從不使用元組,總是列表。我想這個習慣是從試圖修改一個意外發生的元組開始,然後實現列表可以作爲可以修改的元組。是否有一個原因,我不想使用一個元組可以使用的列表? – SwimBikeRun 2012-03-13 23:51:42

+0

爲了解釋獲取元組序列的最大值,元組(和其他序列)按字典順序進行比較;第一項是比較;如果它們是相同的,則比較第二項,等等。你可以在[Sorting How To](http://wiki.python.org/moin/HowTo/Sorting)文檔中看到這一點。至於使用一個元組而不是一個列表作爲序列解包,它在這裏並沒有真正的區別。我在排序中使用習慣中的元組,但使用列表可能更合適,因爲它模仿原始數據結構。 – 2012-03-14 16:09:28

0
print max(td.items(), key = lambda item: item[1][1]) 

關鍵參數接受的功能,並且如果使用的話就會產生最大化該函數的值。

1
>>> td = {0: ['b',3], 1: ['b',6], 4: ['b',2], 3: ['b',5] } 
>>> max(td, key=lambda k:td[k][1]) 
1 ## This is the key with the maximum "value" 

當然你也可以也得到這樣的值

>>> td[max(td, key=lambda k:td[k][1])] 
['b', 6]