2013-07-05 44 views
1

我有一個字典項目,我想從中獲取最大值。這本詞典由2個字典組成。以下是使用Python獲取基於多個字典對象的最大值

new_f_key: {'previous_f_key': {'1g': ['33725.7', '-70.29'], 
           '2g': ['35613.3', '108.83'], 
           '3g': ['32080.9', '-69.86']}, 
      'f_key': {'1g': ['8880.8', '-66.99'], 
         '2g': ['6942.6', '114.79'], 
         '3g': ['12300.3', '-70.34']}} 

我試圖使用上述iteritems()itemgetter()但我沒有得到我想要的值字典。

它應該比較兩個字典中的所有值並輸出最高的值,並輸出該項目的標題以及它所在的字典。

例如,在上面的詞典中,最大值是35613.3,其中的關鍵是2g,它發生在第一個字典對象previous_f_key

+0

爲什麼一切都串?這是JSON嗎?你能不能分開跟蹤最大值? – Marcin

+0

這些值不是字符串,而是它們是浮點值。 – buggsbunny4

+0

我在看你的問題,他們肯定是字符串。 – Marcin

回答

1
dic = {'previous_f_key': {'1g': ['33725.7', '-70.29'], 
           '2g': ['35613.3', '108.83'], 
           '3g': ['32080.9', '-69.86']}, 
      'f_key': {'1g': ['8880.8', '-66.99'], 
         '2g': ['6942.6', '114.79'], 
         '3g': ['12300.3', '-70.34']}} 

maxx = float('-inf') 
for d,v in dic.iteritems(): 
    for k,v1 in v.iteritems(): 
     loc_max = float(max(v1, key = float)) 
     if loc_max > maxx: 
      outer_key = d 
      header = k 
      maxx = loc_max 

print outer_key, header, maxx 

輸出:

previous_f_key 2g 35613.3 
+0

工程很好。那就是我正在尋找的東西。謝謝 – buggsbunny4

+0

@ buggsbunny4很高興幫助。 :)如果它適合你,請隨時[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)。 –

0

你需要創建一個嵌套的循環:

max = -1 
maxkey = -1 
maxdic = -1 
for dic_name, dic in new_f_key.iteritems(): 
    for key, val in dic.iteritems(): 
      if val > max: 
       max = val 
       maxkey = key 
       maxdic = dic_name 

你或許可以挽救參考字典作爲一個簡單的整數標誌,我只是做這這裏爲清楚起見

+0

沒有。迭代一個'dict'會產生密鑰。另外,如果有多層嵌套,會發生什麼? – Marcin

+0

對這個錯誤感到抱歉,只是修正了第一個錯誤。如果有「不止一層嵌套」,你是什麼意思? – sedavidw

1

執行此操作。它將處理任意嵌套,並且它很短。

def weird_max(d, key=float): 
    vals = [] 
    for item in d.itervalues(): 
     if isinstance(item, dict): 
      vals.append(weird_max(item)) 
     else: # should be a list 
      vals.extend(item) 
    return max(vals, key=key) 

這就是說,它依賴於類型測試,它不夠優雅。我通常建議您不要做這種事情,並且要麼保持最大值的運行軌跡,要麼找到一個更好的數據結構來表示這些信息,例如,一堆。

ideone這裏:http://ideone.com/rJ1YZh

1

檢查了這一點:

def maxVal(d): 
    if all(isinstance(v, list) for v in d.values()): 
     return max(d, key=lambda k: max(d[k])) 
    else: 
     k = max(d, key=lambda k: maxVal(d[k])) 
     return k + ":" + maxVal(d[k]) 

測試

In [79]: %paste 
    def maxVal(d): 
     if all(isinstance(v, list) for v in d.values()): 
      return max(d, key=lambda k: max(d[k])) 
     else: 
      k = max(d, key=lambda k: maxVal(d[k])) 
      return k + ":" + maxVal(d[k]) 

## -- End pasted text -- 

In [80]: %paste 
dic = {'previous_f_key': {'1g': ['33725.7', '-70.29'], 
           '2g': ['35613.3', '108.83'], 
           '3g': ['32080.9', '-69.86']}, 
      'f_key': {'1g': ['8880.8', '-66.99'], 
         '2g': ['6942.6', '114.79'], 
         '3g': ['12300.3', '-70.34']}} 

## -- End pasted text -- 

In [81]: maxVal(dic) 
Out[81]: 'previous_f_key:2g' 
+0

我從未想過將當前的功能作爲關鍵。我注意到這最終會遍歷結構多次。 – Marcin

+0

令人遺憾的是,它最終會遍歷結構多次。我想知道,如果我可以寫一個'max'來返回鍵和遍歷,那麼我就不必每次都調用python的'max'。或者也許這是一個很好的候選人,用於記憶動態編程 – inspectorG4dget

+0

如果你看看我的解決方案,它只會遍歷一次(最多兩次)。這樣做的最佳方法是維護一個包含找到的最高項目的變量。我的解決方案並不是因爲我喜歡簡潔和可讀性。 – Marcin

相關問題