首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有相同键的嵌套字典列表的值​之和

具有相同键的嵌套字典列表的值​之和
EN

Stack Overflow用户
提问于 2022-06-29 09:06:13
回答 1查看 39关注 0票数 0

我想用相同的键对嵌套字典的列表进行求和。以下是清单:

代码语言:javascript
复制
[{'CAG': {'PG': 4, 'punti': 0, 'Gol fatti': 0, 'Gol subiti': 3, 'Differenza reti': -3, 'Vittorie': 0, 'Pareggi': 0, 'Sconfitte': 1}}, 
 {'ROM': {'PG': 4, 'punti': 3, 'Gol fatti': 3, 'Gol subiti': 0, 'Differenza reti': 3, 'Vittorie': 1, 'Pareggi': 0, 'Sconfitte': 0}}, 
 {'CAG': {'PG': 4, 'punti': 3, 'Gol fatti': 1, 'Gol subiti': 0, 'Differenza reti': 1, 'Vittorie': 1, 'Pareggi': 0, 'Sconfitte': 0}}, 
 {'ROM': {'PG': 4, 'punti': 0, 'Gol fatti': 0, 'Gol subiti': 1, 'Differenza reti': -1, 'Vittorie': 0, 'Pareggi': 0, 'Sconfitte': 1}}, 
 {'CAG': {'PG': 4, 'punti': 0, 'Gol fatti': 0, 'Gol subiti': 1, 'Differenza reti': -1, 'Vittorie': 0, 'Pareggi': 0, 'Sconfitte': 1}}]

我想检查它们是否具有相同的主键(即'CAG'),然后对相应的值进行求和。

最终结果:

代码语言:javascript
复制
[{'ROM': {'PG': 8, 'punti': 3, 'Gol fatti': 3, 'Gol subiti': 1, 'Differenza reti': 2, 'Vittorie': 1, 'Pareggi': 0, 'Sconfitte': 1}}, 
 {'CAG': {'PG': 12, 'punti': 3, 'Gol fatti': 1, 'Gol subiti': 4, 'Differenza reti': -3, 'Vittorie': 1, 'Pareggi': 0, 'Sconfitte': 2}}]
EN

回答 1

Stack Overflow用户

发布于 2022-06-29 09:14:09

Counter类支持加法,这将使这非常容易。将其与defaultdict of Counter相结合,我们可以得到:

代码语言:javascript
复制
from collections import Counter, defaultdict

l = [{'CAG': {'PG': 4, 'punti': 0, 'Gol fatti': 0, 'Gol subiti': 3, 'Differenza reti': -3, 'Vittorie': 0, 'Pareggi': 0, 'Sconfitte': 1}},
 {'ROM': {'PG': 4, 'punti': 3, 'Gol fatti': 3, 'Gol subiti': 0, 'Differenza reti': 3, 'Vittorie': 1, 'Pareggi': 0, 'Sconfitte': 0}},
 {'CAG': {'PG': 4, 'punti': 3, 'Gol fatti': 1, 'Gol subiti': 0, 'Differenza reti': 1, 'Vittorie': 1, 'Pareggi': 0, 'Sconfitte': 0}},
 {'ROM': {'PG': 4, 'punti': 0, 'Gol fatti': 0, 'Gol subiti': 1, 'Differenza reti': -1, 'Vittorie': 0, 'Pareggi': 0, 'Sconfitte': 1}},
 {'CAG': {'PG': 4, 'punti': 0, 'Gol fatti': 0, 'Gol subiti': 1, 'Differenza reti': -1, 'Vittorie': 0, 'Pareggi': 0, 'Sconfitte': 1}}]

counter = defaultdict(Counter)
for d in l:
    for key, value in d.items():
        counter[key] += Counter(value)

print(counter)

使用defaultdict,我们为每个潜在的键('CAG'/'ROM')创建一个空的Counter。然后,对于我们遇到的每个键,我们将其计数器与值中的Counter相加。

产出如下:

代码语言:javascript
复制
defaultdict(<class 'collections.Counter'>, {'CAG': Counter({'PG': 12, 'Gol subiti': 4, 'punti': 3, 'Sconfitte': 2, 'Gol fatti': 1, 'Vittorie': 1}), 'ROM': Counter({'PG': 8, 'punti': 3, 'Gol fatti': 3, 'Differenza reti': 2, 'Vittorie': 1, 'Gol subiti': 1, 'Sconfitte': 1})})

要获得列表输出,只需简单的操作即可:

代码语言:javascript
复制
print([{key: dict(counts)} for key, counts in counter.items()])

将给予:

代码语言:javascript
复制
[{'CAG': {'PG': 12, 'Gol subiti': 4, 'Sconfitte': 2, 'punti': 3, 'Gol fatti': 1, 'Vittorie': 1}}, 
 {'ROM': {'PG': 8, 'punti': 3, 'Gol fatti': 3, 'Differenza reti': 2, 'Vittorie': 1, 'Gol subiti': 1, 'Sconfitte': 1}}]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72798688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档