Python如何对字典列表按id、environment分组累加cost值
按id和环境分组累加cost的实现方案
问题说明
现有如下结构的字典列表,需要按id、environment两个字段做分组,对同一分组下的cost值求和,最终输出要求为:每个id对应的prod、nonprod环境各保留1条记录,记录内的cost为该id对应环境下所有cost的累加值。
原始示例数据:
[{ "id": "42f409d0-2cef-49b0-a027-59ed571cc2a9", "cost": 0.868422, "environment": "nonprod" }, { "id": "42f409d0-2cef-49b0-a027-59ed571cc2a9", "cost": 0.017017, "environment": "prod" }, { "id": "aa385029-afa6-4f1a-a1d9-d88b7d934699", "cost": 0.010304, "environment": "prod" }, { "id": "b13a0676-6926-49db-808c-3c968a9278eb", "cost": 2.870336, "environment": "nonprod" }, { "id": "b13a0676-6926-49db-808c-3c968a9278eb", "cost": 0.00455, "environment": "prod" }, { "id": "b13a0676-6926-49db-808c-3c968a9278eb", "cost": 0.032458, "environment": "prod" }]
可选实现方案
方案1:纯Python标准库实现(无第三方依赖)
实现逻辑:用(id, environment)二元组作为分组唯一键,遍历原始列表时累加同键对应的cost值,遍历完成后将分组结果转换为目标字典列表结构即可。
代码示例:
from collections import defaultdict # 传入上述原始数据 raw_data = [] # 初始化分组累加容器,同组cost默认从0开始累加 group_map = defaultdict(float) for item in raw_data: group_key = (item["id"], item["environment"]) group_map[group_key] += item["cost"] # 转换为要求的列表结构 result = [ {"id": gid, "environment": env, "cost": total_cost} for (gid, env), total_cost in group_map.items() ]
运行后输出结果:
[ {"id": "42f409d0-2cef-49b0-a027-59ed571cc2a9", "environment": "nonprod", "cost": 0.868422}, {"id": "42f409d0-2cef-49b0-a027-59ed571cc2a9", "environment": "prod", "cost": 0.017017}, {"id": "aa385029-afa6-4f1a-a1d9-d88b7d934699", "environment": "prod", "cost": 0.010304}, {"id": "b13a0676-6926-49db-808c-3c968a9278eb", "environment": "nonprod", "cost": 2.870336}, {"id": "b13a0676-6926-49db-808c-3c968a9278eb", "environment": "prod", "cost": 0.037008} ]
方案特点:
- 无需安装任何第三方依赖,兼容所有Python3运行环境
- 遍历一次数据即可完成计算,时间复杂度O(n),性能稳定,适合线上业务逻辑使用
- 如果需要固定结果顺序,可以在外层套
sorted()函数,自定义排序规则即可
方案2:pandas实现(适合数据处理场景)
如果运行环境已经安装pandas依赖,做批量数据处理时可以直接用pandas内置的分组聚合方法,代码更简洁。
代码示例:
import pandas as pd # 传入上述原始数据 raw_data = [] df = pd.DataFrame(raw_data) # 按id、environment分组,对cost求和 agg_df = df.groupby(by=["id", "environment"], as_index=False)["cost"].sum() # 转换为和原始格式一致的字典列表 result = agg_df.to_dict("records")
方案特点:
- 代码量少,内置聚合逻辑经过性能优化,处理十万级以上大批量数据时效率更高
- 适合数据分析、离线报表处理等场景,不建议仅为该逻辑额外引入pandas依赖到线上业务项目
内容的提问来源于stack exchange,提问作者poppinpython
相关产品推荐
相关产品推荐

