如何用相同的键值求和dict元素



有一个字典列表:

list_dict = [
{
"id_sistema_productivo": 48,
"area": 327
},
{
"id_sistema_productivo": 51,
"area": 205.65
},
{
"id_sistema_productivo": 48,
"area": 327
},
{
"id_sistema_productivo": 51,
"area": 209.13
}
]

我不认为我做得很对(被困了几个小时(,但预期的反应应该是这样的:

new_list_dict = [
{
"id_sistema_productivo": 48,
"area": 654
},
{
"id_sistema_productivo": 51,
"area": 414.78
},
]

所有字典都有相同的关键字,您可以首先使用默认dict对每个关键字求和,然后根据结果重建列表:

from collections import defaultdict

result = defaultdict(int)
for d in list_dict:
result[d["id_sistema_productivo"]] += d["area"]
result = [{"id_sistema_productivo": id, "area": area} for id, area in result.items()]

如果字典键总是相同的,考虑将其封装在一个类中,它会更清晰(例如使用dataclass,这非常方便(:

from dataclasses import dataclass
@dataclass
class Element:
id_sistema_productivo: int
area: int

然后你可以更容易地表达你想要的东西:

list_dict = [
Element(48, 327),
Element(51, 205.65),
Element(48, 327),
Element(51, 209.13)
]
result = defaultdict(int)
for element in list_dict:
result[element.id_sistema_productivo] += element.area
result = [Element(i, a) for i, a in result.items()]
print(result)

您可以使用pandas:

import pandas as pd
list_dict = [
{
"id_sistema_productivo": 48,
"area": 327
},
{
"id_sistema_productivo": 51,
"area": 205.65
},
{
"id_sistema_productivo": 48,
"area": 327
},
{
"id_sistema_productivo": 51,
"area": 209.13
}
]
df=pd.DataFrame(list_dict)
data=df.groupby(['id_sistema_productivo']).sum()
print(data)

假设输入的可预测性与Louis 相同

list_of_dicts = [                                                                                                                                                                                                  
{
"id_sistema_productivo": 48, 
"area": 327 
},  
{
"id_sistema_productivo": 51, 
"area": 205.65
},  
{
"id_sistema_productivo": 48, 
"area": 327 
},  
{
"id_sistema_productivo": 51, 
"area": 209.13
}
]
from collections import Counter
c = Counter()
[c.update({d["id_sistema_productivo"]: d["area"]}) for d in list_of_dicts]
result = [{"id_sistema_produtivo":k, "area":v} for k,v in c.items()]
print(result)

给出输出

[{'id_sistema_produtivo': 48, 'area': 654}, {'id_sistema_produtivo': 51, 'area': 414.78}]