gpt4 book ai didi

python - 总结 python 中的嵌套字典值

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:04 25 4
gpt4 key购买 nike

我有这样一本字典,

data={11L: [{'a': 2, 'b': 1},{'a': 2, 'b': 3}],
22L: [{'a': 3, 'b': 2},{'a': 2, 'b': 5},{'a': 4, 'b': 2},{'a': 1, 'b': 5}, {'a': 1, 'b': 0}],
33L: [{'a': 1, 'b': 2},{'a': 3, 'b': 5},{'a': 5, 'b': 2},{'a': 1, 'b': 3}, {'a': 1, 'b': 6},{'a':2,'b':0}],
44L: [{'a': 4, 'b': 2},{'a': 4, 'b': 5},{'a': 3, 'b': 1},{'a': 3, 'b': 3}, {'a': 2, 'b': 3},{'a':1,'b':2},{'a': 1, 'b': 0}]}

这里去掉外键,赋予新的键值1,2,3等等,我想得到如下图的结果,

result={1:{'a':10,'b':7},2:{'a':11,'b':18},3:{'a':12,'b':5},4:{'a':5,'b':11},5:{'a':3,'b':9},6:{'a':3,'b':2},7:{'a':1,'b':0}}

我尝试过这样的事情,但我没有得到所需的结果,

d = defaultdict(int)
for dct in data.values():
for k,v in dct.items():
d[k] += v
print dict(d)

我希望结果字典的键是动态的,就像在上面的数据字典中我们有 44 个最高的键值对,因此我们有 7 个键的结果字典等等

最佳答案

你想在这里使用一个列表,你可能想使用 Counter() 对象来使求和更容易:

from collections import Counter
from itertools import izip_longest

for dcts in data.values():
for i, dct in enumerate(dcts):
if i >= len(result):
result.append(Counter(dct))
else:
result[i].update(dct)

结果:

>>> result
[Counter({'a': 10, 'b': 7}), Counter({'b': 18, 'a': 11}), Counter({'a': 12, 'b': 5}), Counter({'b': 11, 'a': 5}), Counter({'b': 9, 'a': 4}), Counter({'a': 3, 'b': 2}), Counter({'a': 1, 'b': 0})]

Counter() 对象是 dict 的子类,因此它们在其他方面表现为字典。如果之后您必须拥有 dict 值,请添加以下行:

result = [dict(r) for r in result]

从 Eric 那里得到启发,您可以将上面的内容转换为一行代码:

from collections import Counter
from itertools import izip_longest

result = [sum(map(Counter, col), Counter())
for col in izip_longest(*data.values(), fillvalue={})]

此版本与上面的循环略有不同,因为在求和时从计数器中删除为 0 的键。如果要在最后一个计数器中保留 'b': 0,请使用:

[reduce(lambda c, d: c.update(d) or c, col, Counter())
for col in izip_longest(*data.values(), fillvalue={})]

这再次使用了 .update()

关于python - 总结 python 中的嵌套字典值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16645088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com