Python中如何合并JSON列表内同名对象的多个项目数据为列表
同名人员项目归集实现方法
你当前逐次追加单条目的写法不会自动做同名合并,可通过字典以姓名为唯一键遍历归集,以下是可直接运行的实现代码:
基础实现(无额外依赖)
# 此处替换为你从接口解析得到的原始条目列表 raw_data = [ {"name":"Lucas White", "project":{"key_project":"EB-648", "name_status":"Open"}}, {"name":"Lisa Booth", "project":{"key_project":"EB-647", "name_status":"Open"}}, {"name":"Lucas White", "project":{"key_project":"EB-645", "name_status":"Development In Progress"}} ] merged_result = {} for item in raw_data: user_name = item["name"] # 首次遇到该姓名时初始化条目结构 if user_name not in merged_result: merged_result[user_name] = { "name": user_name, "project_keys": [], # 存归集后的key_project "projects": [] # 如果你需要保留完整项目信息(含状态)就留这个字段 } # 追加当前项目key到列表 merged_result[user_name]["project_keys"].append(item["project"]["key_project"]) # 如果要保留完整项目信息就打开下面这行 # merged_result[user_name]["projects"].append(item["project"]) # 转成列表格式输出 final_list = list(merged_result.values())
输出效果
[ { "name": "Lucas White", "project_keys": ["EB-648", "EB-645"], "projects": [ {"key_project":"EB-648", "name_status":"Open"}, {"key_project":"EB-645", "name_status":"Development In Progress"} ] }, { "name": "Lisa Booth", "project_keys": ["EB-647"], "projects": [{"key_project":"EB-647", "name_status":"Open"}] } ]
简化写法(使用标准库defaultdict)
如果不想手动判断键是否存在,可以用Python标准库collections.defaultdict减少冗余判断:
from collections import defaultdict merged_result = defaultdict(lambda: {"name": "", "project_keys": [], "projects": []}) for item in raw_data: user_name = item["name"] merged_result[user_name]["name"] = user_name merged_result[user_name]["project_keys"].append(item["project"]["key_project"]) merged_result[user_name]["projects"].append(item["project"]) final_list = list(merged_result.values())
注意事项
- 不建议长期用姓名字段做唯一归集键,如果后续出现同名不同人的情况会导致数据混淆,有人员唯一ID的话优先用ID做键
- 你贴出的原始JSON片段存在语法问题(缺少外层列表包裹、Lisa Booth对应条目后缺失逗号),实际处理接口返回数据时用
json.loads()方法解析即可自动校验格式,不用手动修正。
内容的提问来源于stack exchange,提问作者Vendrix
相关产品推荐
相关产品推荐

