按键对子区域中的值求和

时间:2018-06-05 19:30:20

标签: python

有一个像这样的词典:

x  = {
  '1': {'a': 1, 'b': 3},
  '2': {'a': 2, 'b': 4}
}

我想要一个新的密钥total,其中包含子区域中每个密钥的总和,例如:

x['total'] = {'a': 3, 'b': 7}

我尝试调整this question的答案,但没有成功。

有人会发光吗?

4 个答案:

答案 0 :(得分:3)

假设x的所有值都是字典,您可以迭代它们的项目来编写新字典。

from collections import defaultdict

x  = {
  '1': {'a': 1, 'b': 3},
  '2': {'a': 2, 'b': 4}
}

total = defaultdict(int)

for d in x.values():
    for k, v in d.items():
        total[k] += v

print(total)
# defaultdict(<class 'int'>, {'a': 3, 'b': 7})

答案 1 :(得分:3)

Patrick回答的变体,使用collections.Counterupdate,因为子字母已经采用了正确的格式:

from collections import Counter

x  = {
  '1': {'a': 1, 'b': 3},
  '2': {'a': 2, 'b': 4}
}

total = Counter()

for d in x.values():
    total.update(d)

print(total)

结果:

Counter({'b': 7, 'a': 3})

updateCounter的工作方式不同,它不会覆盖密钥但会增加当前值,这是与defaultdict(int)的细微差别之一)

答案 2 :(得分:0)

您可以使用词典理解:

x = {'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}}
full_sub_keys = {i for b in map(dict.keys, x.values()) for i in b}
x['total'] = {i:sum(b.get(i, 0) for b in x.values()) for i in full_sub_keys}

输出:

{'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}, 'total': {'b': 7, 'a': 3}}

答案 3 :(得分:0)

from collections import defaultdict
dictionary = defaultdict(int)
x  = {
     '1': {'a': 1, 'b': 3},
     '2': {'a': 2, 'b': 4}
     }

for key, numbers in x.items():
    for key, num in numbers.items():
          dictionary[key] += num

x['total'] = {key: value for key, value in dictionary.items()}
print(x)

我们可以创建一个默认的dict来迭代嵌套字典中的每个键值对,并总结每个键的总数。这应该使得a能够评估为3而b要评估为7.在我们递增值之后,我们可以执行简单的字典理解来为总计创建另一个嵌套字典,并使a / b成为键,并将它们的值相加。这是你的输出:

{'1': {'a': 1, 'b': 3}, '2': {'a': 2, 'b': 4}, 'total': {'a': 3, 'b': 7}}