如何对多维字典中的值进行求和?

4

通常我会使用sum(dict ['A'] .values())来对key为"A"的字典中所有值进行求和。然而,在这种情况下,我想要求和的不是“main”键的所有值,而是“secondary/sub-key”具有特定名称的所有值。让我展示一个简化的例子:

dict = {'A':{'val1':3,'val2':5},'B':{'val1':2,'val2':6}}
sum1 = dict['A']['val1']+dict['B']['val1']
sum2 = dict['A']['val2']+dict['B']['val2']

上面的示例相对简单,因为它只有2*2的维度,因此我可以直接添加值。但是当字典变得更大时,这种方法就不实用了。所以我想知道最有效的解决方案。


这个字典 {'A':{'val5': 1,'val1':3,'val2':5},'B':{'val3':2,'val2':6, 'val1': 10}} 的结果应该是什么? - RomanPerekhrest
你想要打印字典中 'A' 键下的值还是所有值的总和? - mb0850
可能是Sum nested key values of dict的重复问题。 - SpghttCd
6个回答

3

要对单个子键进行值求和,您可以使用带有生成器表达式的sum()

>>> d = {'A': {'val1': 3,'val2': 5}, 'B': {'val1': 2, 'val2': 6}}
>>> sum(x['val1'] for x in d.values())
5

要对所有子键的值进行汇总,可以使用collections.Counter

>>> from collections import Counter
>>> counter = sum(map(Counter, d.values()), Counter())
>>> dict(counter)
{'val2': 11, 'val1': 5}

2
你可以遍历字典的键并检索值,将它们添加到一个变量中。
所以你需要先声明存储总和的sum变量,然后遍历字典中的每个键,将相应的值添加到sum变量中。你也可以随时添加更多的值,比如val3sum3val4sum4等等。下面是一个例子:
my_dict = {'A':{'val1':3,'val2':5},'B':{'val1':2,'val2':6}}

# initiate variables to store the sums
sum1, sum2 = (0,) * 2

# iterate through the keys of your dict and increment the sum variables
for key in my_dict:
    sum1 += my_dict[key]['val1']
    sum2 += my_dict[key]['val2']

print(sum1)
print(sum2)

这将打印:

5
11

此外,正如@jpp所提到的,永远不要将变量命名为类的名称,因此不要将您的字典命名为dict,例如,您可以将其命名为my_dict

两点。第一,永远不要以类的名称命名你的字典,例如使用my_dict而不是dict。第二点,为什么不使用for key in my_dict: ...进行迭代?iterkeys不是迭代键所必需的。 - jpp
1
@jpp 我知道命名规范,我只是复制了问题中的代码。但我同意你的第二点,谢谢你指出来。 - Adam Jaamour

0
使用 collections.Counter
>>> from collections import Counter
>>> d = {'A':{'val1':3,'val2':5},'B':{'val1':2,'val2':6}}
>>> sum((Counter(d[x]) for x in d), Counter())
Counter({'val2': 11, 'val1': 5})

还要注意,不应将您的字典命名为dict。这会遮蔽内置的dict函数。


0
我建议您采用易于阅读和理解的解决方案,它会迭代每个键/值对,更新一个新字典,其中包含输入字典值的总和,无论输入字典大小如何。我还将输入字典重命名为d,而不是dict,因为dict是Python内置类的名称:
from collections import defaultdict

d = {'A':{'val1':3,'val2':5},'B':{'val1':2,'val2':6}}

sumDict = defaultdict(int)

for v1 in d.values():
    for k2,v2 in v1.items():
        sumDict[k2] += v2

print(dict(sumDict))    # {'val1': 5, 'val2': 11}
print(sumDict['val1'])  # 5
print(sumDict['val2'])  # 11

0
你可以将字典中每个元素的总和存储在一个新字典中。
dict = {'A':{'val1':3,'val2':5},'B':{'val1':2,'val2':7}}
sums = {}
sum = 0
for element in dict:
    for key in dict[element]:
        sum += dict[element][key]
    sums[element] = sum
    sum = 0
print(sums['A']) # 8
print(sums['B']) # 9

0
你可以找到相关键的并集。然后使用字典推导式构建一个将这些键映射到它们的总和的字典:
d = {'A':{'val1':3,'val2':5},'B':{'val1':2,'val2':6}}

sum_keys = set().union(*d.values())
sums = {k: sum(d[i].get(k, 0) for i in d) for k in sum_keys}

print(sums)

{'val1': 5, 'val2': 11}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接