You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:24:27