在嵌套字典中添加所有键值

时间:2018-03-09 04:39:53

标签: python dictionary nested

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

这就是我要传递的内容

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}

但是我如何才能使数据累积,因为它只是从第一本字典中提供数据。

4 个答案:

答案 0 :(得分:2)

你可以这样做,

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}

答案 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。抓住该错误并插入密钥。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您可以使用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}