首页 / PYTHON / 在python中对嵌套字典值求和
在python中对嵌套字典值求和
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在python中对嵌套字典值求和,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1854字,纯文字阅读大概需要3分钟。
内容图文
![在python中对嵌套字典值求和](/upload/InfoBanner/zyjiaocheng/744/e7a6d781a2424dbf8cbf6b5298247591.jpg)
我有这样的字典,
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个键值对,因此我们有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中对嵌套字典值求和所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。