有一个像这样的词典:
x = {
'1': {'a': 1, 'b': 3},
'2': {'a': 2, 'b': 4}
}
我想要一个新的密钥total
,其中包含子区域中每个密钥的总和,例如:
x['total'] = {'a': 3, 'b': 7}
我尝试调整this question的答案,但没有成功。
有人会发光吗?
答案 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.Counter
和update
,因为子字母已经采用了正确的格式:
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})
(update
对Counter
的工作方式不同,它不会覆盖密钥但会增加当前值,这是与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}}