【问题标题】:Adding defaultdicts together on key then dividing them在 key 上添加 defaultdicts 然后划分它们
【发布时间】:2016-08-09 19:11:20
【问题描述】:

我有一个包含 1000 多个默认字典的字典,我想遍历每个默认字典,将它们按键相加,然后除以计数以获得每个键的平均值。

每个默认字典都有相同的键,即

{'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}
{'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}

我希望以下内容成为我的输出

{'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0}

如何迭代地添加默认字典,然后划分它们,在 DataFrame 中进行行操作?还是有更好的方法来做到这一点?

谢谢

【问题讨论】:

  • 这些是 defaultdicts 是否相关?
  • 不,这就是我读它们的方式,我猜想我可以把它们读成其他东西。

标签: python dictionary


【解决方案1】:

如何在sum 中使用字典理解:

d1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}
d2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}
dicts = {"d1": d1, "d2": d2}
n = len(dicts)
res = {k: sum(d[k] for d in dicts.values()) / n for k in d1}
# {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0}

注意:这是假设,正如您在问题中所写,所有 dicts 都具有相同的键,或者是defaultdicts,因此缺少键不会导致错误。

【讨论】:

    【解决方案2】:

    您可以使用collections.Counter 稍微简化一下:

    summed_dict = collections.Counter()
    for d in partial_dicts:
        summed_dict.update(d)
    
    # Use .viewitems or .iteritems instead of .items on Py2
    average_dict = {k: v / len(partial_dicts) for k, v in summed_dict.items()}
    

    【讨论】:

      【解决方案3】:

      您可以使用pandas.Series 对两个字典值进行平均,然后将系列转换回字典:

      import pandas as pd
      
      a = pd.Series({'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0})
      b = pd.Series({'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0})
      c = ((a+b)/2).round(1)
      print(c.to_dict())
      # {'A': 1.0, 'B': 1.1, 'D': 1.0, 'E': 2.0, 'C': 2.0}
      

      【讨论】:

        【解决方案4】:

        将您的数据视为 dicts 的 dict,那么我就是这样做的(非常实用的方法):

        
        d = {1: {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0},
         2: {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}}
        
        import functools
        
        def add_dicts(d1, d2):
            return {k:d1[k]+d2[k] for k in d1}
        
        dsum = functools.reduce(add_dicts, d.values())
        
        N = len(d.keys())
        davg = {k:v/N for k,v in dsum.items()}
        print(davg)
        

        输出:

        {'C': 2.0, 'E': 2.0, 'A': 1.0, 'B': 1.1, 'D': 1.0}
        

        【讨论】:

          【解决方案5】:

          遍历一个字典的键和值,并将值添加到另一个字典中对应键的值中。
          示例:

          dict1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}
          dict2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}
          for key,value in dict1.iteritems():
              dict2[key] = (value + dict2[key]) / 2
          print dict2 # prints {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0 }
          

          为简单起见,您也可以创建一个新字典:

          dict1 = {'A': 0.0, 'B': 1.0, 'C': 1.0, 'D': 1.0, 'E': 1.0}
          dict2 = {'A': 2.0, 'B': 1.2, 'C': 3.0, 'D': 1.0, 'E': 3.0}
          dictAns = dict()
          for key,value in dict1.iteritems():
              dictAns[key] = (value + dict2[key]) / 2
          print dictAns # prints {'A': 1.0, 'B': 1.1, 'C': 2.0, 'D': 1.0, 'E': 2.0 }
          

          【讨论】:

          • 你为什么要迭代项目`看起来你只是在使用密钥。
          • @tobias_k:嗯,他们可以通过将dict1[key] 替换为value 来保存查找。
          • 如果我有两个以上的字典怎么办?
          • 感谢您的 cmets。如果您有超过 2 个字典,则必须分别添加每个字典项目,例如 value + dict2[key] + dict3[key] + .../ num of dicts。相反,如果您有一个 dicts 列表,您可以简单地在内部 for 循环中迭代它们并将它们添加到平均值,然后将平均值除以 dicts 的数量。
          猜你喜欢
          • 1970-01-01
          • 2017-05-06
          • 2021-08-04
          • 1970-01-01
          • 2014-12-25
          • 2016-08-18
          • 2012-09-26
          • 2014-07-10
          • 1970-01-01
          相关资源
          最近更新 更多