2014-02-16 25 views
1

我有3年統計數據存儲在3個字典中。我想在3年內找到每月的最低價值。例如,對於一月它將是10.而對於二月將是15.查找3個不同字典的MIN&MAX值

我需要將結果存儲在一個新的字典中。例如,{「January」:12,「February」:15,...}

我應該如何繼續?

stat2011 = {"January": 12, "February": 20, "March": 50, "April": 70, "May": 15, 
      "June": 35, "July": 30, "August": 15, "September": 20, "October": 60, 
      "November": 13, "December": 50} 

stat2012 = {"January": 36, "February": 15, "March": 50, "April": 10, "May": 90, 
      "June": 25, "July": 35, "August": 15, "September": 20, "October": 30, 
      "November": 10, "December": 25} 

stat2013 = {"January": 10, "February": 60, "March": 90, "April": 10, "May": 80, 
      "June": 50, "July": 30, "August": 15, "September": 20, "October": 75, 
      "November": 60, "December": 15} 
+0

的結果應該如何?在字典中? – thefourtheye

回答

2

這裏有一個辦法做到這一點:

minstat = {} 
for month in stat2011: 
    minstat[month] = min(stat2011[month], stat2012[month], stat2013[month]) 

其他的答案比我聰明,但有時是最聰明的解決方案是最容易閱讀:)

+2

我喜歡這個答案。但爲了使代碼更加濃縮,您可以擺脫內部圓括號。 min(stat2011 [month],stat2012 [month],stat2013 [month])就夠了 – lessthanl0l

+1

@ lessthanl0l好點!編輯我的答案。 – tinybike

5
In [2]: stats=[stat2011, stat2012, stat2013] 

In [3]: min(i['January'] for i in stats) 
Out[3]: 10 

In [4]: min(i['February'] for i in stats) 
Out[4]: 15 

如果你想每個月的最小值存儲在一個字典:

In [8]: {k:min(i[k] for i in stats) for k in stat2011} 
Out[8]: 
{'April': 10, 
'August': 15, 
'December': 15, 
'February': 15, 
'January': 10, 
'July': 30, 
'June': 25, 
'March': 50, 
'May': 15, 
'November': 10, 
'October': 30, 
'September': 20} 
2
months = ['February', 'October', 'January', 'April', 'November', 
'March', 'August', 'May', 'December', 'June', 'September', 'July'] 

result, data = {}, [stat2011, stat2012, stat2013] 
for month in months: 
    result.setdefault(month, {}) 
    result[month]["max"] = max(year_data[month] for year_data in data) 
    result[month]["min"] = min(year_data[month] for year_data in data) 

print result 

輸出

{'April': {'max': 70, 'min': 10}, 
'August': {'max': 15, 'min': 15}, 
'December': {'max': 50, 'min': 15}, 
'February': {'max': 60, 'min': 15}, 
'January': {'max': 36, 'min': 10}, 
'July': {'max': 35, 'min': 30}, 
'June': {'max': 50, 'min': 25}, 
'March': {'max': 90, 'min': 50}, 
'May': {'max': 90, 'min': 15}, 
'November': {'max': 60, 'min': 10}, 
'October': {'max': 75, 'min': 30}, 
'September': {'max': 20, 'min': 20}} 

您可以使用collections.Counter這樣至得到最大和最小

爲了得到最大的,

print reduce(lambda x, y: x | Counter(y), data, Counter()) 

# Counter({'March': 90, 'May': 90, 'October': 75, 'April': 70, 'February': 60, 'November': 60, 'June': 50, 'December': 50, 'January': 36, 'July': 35, 'September': 20, 'August': 15}) 

爲了獲得最小

print reduce(lambda x, y: x & Counter(y), data[1:], Counter(data[0])) 

# Counter({'March': 50, 'October': 30, 'July': 30, 'June': 25, 'February': 20, 'September': 20, 'August': 15, 'May': 15, 'December': 15, 'January': 10, 'April': 10, 'November': 10}) 
4

有一個整潔的方式做到這一點使用集合。

from collections import Counter 

stat2011 = {"January": 12, "February": 20, "March": 50, "April": 70, "May": 15, 
      "June": 35, "July": 30, "August": 15, "September": 20, "October": 60, 
      "November": 13, "December": 50} 

stat2012 = {"January": 36, "February": 20, "March": 50, "April": 10, "May": 90, 
      "June": 25, "July": 35, "August": 15, "September": 20, "October": 30, 
      "November": 10, "December": 25} 

stat2013 = {"January": 10, "February": 60, "March": 90, "April": 10, "May": 80, 
      "June": 50, "July": 30, "August": 15, "September": 20, "October": 75, 
      "November": 60, "December": 15} 

print dict(Counter(stat2011) & Counter(stat2012) & Counter(stat2013)) # MIN 
print dict(Counter(stat2011) | Counter(stat2012) | Counter(stat2013)) # MAX 
+0

+1:有趣!不知道'&' ;) – zhangxaochen