【问题标题】:Add all of the key values in a nested Dictionary在嵌套字典中添加所有键值
【发布时间】:2018-08-17 14:35:22
【问题描述】:

我正在尝试编写一个函数来添加嵌套字典的所有内部键和值对。

这就是我要传递的内容

Pets = {'family1':{'dogs':2,'cats':3,'fish':1},
       'family2':{'dogs':3,'cats':2}}

这是我期望的结果

{'dogs': 5, 'cats': 5, 'fish': 1}

这是我目前写的循环

def addDict(d):
    d2 = {}
    for outKey, inKey in d.items():
        for inVal in inKey:
            print(inVal, " ", inKey[inVal])
            d2[inVal] = inKey[inVal]
    return d2

打印出来

dogs   2
cats   3
fish   1
dogs   3
cats   2

然后返回

{'dogs': 3, 'cats': 2, 'fish': 1}

但是我怎样才能让数据是累积的,因为它只是给我来自第一个字典的数据。

【问题讨论】:

    标签: python dictionary nested


    【解决方案1】:

    你可以这样做,

    Pets={'family1': {'cats': 3, 'dogs': 2, 'fish': 1},
     'family2': {'cats': 2, 'dogs': 3}}
    d={}
    for i in Pets:
        for j in Pets[i]:
            if j in d:
                d[j] += Pets[i][j]
            else:
                d[j] = Pets[i][j]
    
    print d
    
    >> Output
    {'cats': 5, 'dogs': 5, 'fish': 1}
    

    【讨论】:

      【解决方案2】:

      你可以用这个:

      pets = {'family1':{'dogs':2,'cats':3,'fish':1},
             'family2':{'dogs':3,'cats':2}}
      
      def addDict(d):
          d2 = {}
          for outKey, inKey in d.items():
              for inKey, inVal in inKey.items():
                  try:
                      d2[inKey] += inVal
                  except KeyError:
                      d2[inKey] = inVal
          return d2
      
      print(addDict(pets))
      

      输出:

      {'dogs': 5, 'cats': 5, 'fish': 1}
      

      这称为EAFP principle in Python。您要做的就是尝试为键添加值。如果密钥不存在,它会抛出一个KeyError。捕获该错误并插入密钥。

      【讨论】:

        【解决方案3】:

        你离得太近了!只需在将 d2 的 inval 设置为 += 的部分更改 = 即可。基本上,您要添加该值,而不是覆盖它。但是您还想在添加之前先检查该密钥是否存在。所以:

        if inVal in d2: d2 [inVal] += inKey [inVal]
        else: d2 [inVal] = inKey [inVal]
        

        【讨论】:

        • 如果两个嵌套字典具有相同数量的键值对,这将起作用,否则会抛出错误。
        • 好的,那么简单的if 语句首先要检查。我现在就加进去
        【解决方案4】:

        您可以使用collection.Counter 为您完成所有计数

        from collections import Counter
        
        def addDict(d):
            c = Counter()
            [c.update(a) for a in d.values()]
            return dict(c)
        
        >>> Pets = {
                    'family1':{'dogs':2,'cats':3,'fish':1},
                    'family2':{'dogs':3,'cats':2}
                    }
        >>> addDict(Pets)
        >>> {'cats': 5, 'fish': 1, 'dogs': 5}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-17
          • 2018-04-25
          • 1970-01-01
          • 2019-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多