我正在尝试编写一个添加嵌套字典的所有内部键和值对的函数。
这就是我要传递的内容
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}
但是我如何才能使数据累积,因为它只是从第一本字典中提供数据。
答案 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}