【问题标题】:Finding MIN & MAX values across 3 different dictionaries在 3 个不同的字典中查找 MIN 和 MAX 值
【发布时间】:2014-03-15 11:22:51
【问题描述】:

我有 3 年的统计数据存储在 3 个字典中。我想找到 3 年内每个月的最小值。例如,1 月为 10。2 月为 15。

我需要将结果存储在新字典中。例如,{"一月": 12, "二月": 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}

【问题讨论】:

  • 结果应该如何?在字典里?

标签: python dictionary max min


【解决方案1】:
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】:

    有一种使用集合的巧妙方法。

    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
    

    【讨论】:

      【解决方案3】:

      这是一种方法:

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

      其他答案比我的聪明,但有时最不聪明的解决方案是最容易阅读的:)

      【讨论】:

      • 我喜欢这个答案。但是为了让代码更简洁,可以去掉内括号。 min(stat2011[month], stat2012[month], stat2013[month]) 就足够了
      【解决方案4】:
      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})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-02
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 2021-05-04
        • 1970-01-01
        • 2021-02-12
        • 2021-12-11
        相关资源
        最近更新 更多