我的数据结构如下:
all= {
'part1': {'act1': [0, 0], 'act2': [100, 0]},
'part2': {'act1': [25, 1], 'act2': [100, 1]},
'part3': {'act1': [25, 0], 'act2': [0, 1]},
'part4': {'act1': [0, 0], 'act2': [0, 1]}
}
我的目标是获取列表中所有第一项的总和。
到目前为止,我仅使用以下代码设法获得了顶级词典的每个键的总和:
for partData in all.values():
depPart = 0
for act in partData.keys():
depPart += partData[act][0]
print(depPart)
返回
100
125
25
0
同时我想得到总和,即250
我为获得该总和而进行的每一次尝试都导致错误。
是否正在循环执行此操作,如果可以,如何执行?还是有另一种/更好的方法去实现它? 谢谢
答案 0 :(得分:3)
您可以将sum
函数与生成器表达式一起使用,该表达式对dict和sub-dict的值进行迭代:
sum(n for d in a.values() for n, _ in d.values())
这将返回:
250
请注意,all
是内置函数名称,因此我将问题中的all
变量重命名为a
。
答案 1 :(得分:1)
原因是首先
for partData in all.values():
depPart = 0
for act in partData.keys():
depPart += partData[act][0]
print(depPart)
在第2行depPart=0
上,每次从所有print(depPart)
打印出一个值时,每次都会将每个值中的每个值相加,因此代码应该是
depPart = 0
for partData in all.values():
for act in partData.keys():
depPart += partData[act][0]
print(depPart)
希望有帮助
答案 2 :(得分:0)
您可以对sum
使用列表推导:
d = {'part1': {'act1': [0, 0], 'act2': [100, 0]}, 'part2': {'act1': [25, 1], 'act2': [100, 1]}, 'part3': {'act1': [25, 0], 'act2': [0, 1]}, 'part4': {'act1': [0, 0], 'act2': [0, 1]}}
_sum = sum(sum(a for a, *_ in c.values()) for c in d.values())
输出:
#[100, 125, 25, 0]
250