Python遍历字典列表时如何复用已存在字典key 避免生成重复条目
原实现的核心问题
直接按原逻辑跑的话,会出现两个硬伤:
- 每遍历一条源数据,都会全新生成一套用户字典和依赖字典,完全没有校验同名用户是否已经存在,每轮都把新字典直接塞到结果列表里,自然会把同一个Alice拆成两个独立顶层条目
- 依赖项的键写死成了字符串
"dep_name",实际生成的键名不会替换成真实的依赖人名称(Pammy/Trudyl),和预期的嵌套结构不符
修正实现思路
核心是把顶层结构从“每轮新建字典再塞列表”,改成“以用户名为唯一键的字典存储”,从结构上杜绝同名重复:
- 初始化一个以用户名为键的顶层字典,用来存所有用户的公共属性
- 每读取一条源记录,先检查这条记录对应的用户是否已经在顶层字典里:
- 如果是第一次遇到这个用户:才初始化他的预留待填充属性(NEWKEY、ANOTHERKEY),同时建一个空的DEPENDENTS容器
- 如果用户已经存在:不重置公共属性,直接操作已有的用户节点
- 把当前记录对应的依赖人信息,以真实的依赖人名字为键,追加到对应用户的DEPENDENTS容器下
可运行修正代码
from collections import defaultdict # 顶层结构以用户名为键,从结构上避免同名重复 user_grouped_result = defaultdict(dict) for row in names: uname = row["name"] # 仅首次遇到该用户时初始化基础属性 if uname not in user_grouped_result: user_grouped_result[uname] = { "NEWKEY": None, # 预留待后续填充 "ANOTHERKEY": None, # 预留待后续填充 "DEPENDENTS": {} } # 按真实依赖人名称写入嵌套结构 dep_name = row["dep_name"] user_grouped_result[uname]["DEPENDENTS"][dep_name] = { "is_minor": row["is_dep_minor"], "is_insured": row["is_insured"] }
如果最终需要顶层是列表格式(和原代码的输出形态一致),只需要在循环结束后做一次转换即可:
final_output = [{uname: attrs} for uname, attrs in user_grouped_result.items()]
输出匹配效果
运行后得到的user_grouped_result["Alice"]结构和预期的目标完全一致:仅保留一份公共属性,两个依赖人Pammy、Trudyl都整合在同一个DEPENDENTS字段下;Bob对应的节点也会正常生成,包含关联的依赖人Charlie。
内容的提问来源于stack exchange,提问作者adm1196
相关产品推荐
相关产品推荐

