python:多维字典中的求和值

时间:2018-06-15 07:38:44

标签: python dictionary

通常我会使用sum(dict ['A']。values())来将字典中的所有值与键“A”相加。但是在这种情况下,并不是我想要求和的“主”键的所有值,而是“次要/子键”具有特定名称的所有值。让我在下面展示一个简化的例子:

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维度,因此我可以相当容易地直接添加值。但是当字典变大时,这种方法是不实用的。所以我想知道什么是最有效的解决方案。

提前致谢

6 个答案:

答案 0 :(得分:1)

您可以遍历dict的键并检索值以将它们添加到变量中。

因此,您首先要声明将存储和的sum变量,然后遍历dict中的每个键,将相应的值添加到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

答案 1 :(得分:0)

要对单个子项的值求和,可以将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 :(得分: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函数。

答案 3 :(得分: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

答案 4 :(得分:0)

您可以将dict中每个元素的总和存储在新词典中

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

答案 5 :(得分: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}