2014-02-16 62 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