Python遍历字典集合增删元素仅首个条目更新异常排查
问题原因
代码存在两处核心问题,直接导致你遇到的异常现象:
return(parent_dict)缩进错误:该返回语句被写在了两层for循环的内部,程序处理完parent_dict第一个键对应的集合后,就会直接执行return终止函数运行,后续所有键值对完全不会进入处理流程,这是只有第一个键值对更新成功的根本原因。你之前尝试用.discard()替换.remove()没有任何效果,也是因为代码根本没有执行到后续集合的处理步骤。- 迭代集合时直接修改原集合存在逻辑隐患:Python中的集合是无序可变对象,在for循环遍历原集合的过程中执行增、删操作,会打乱迭代器的遍历指针,引发元素漏遍历、重复遍历的问题,哪怕修正了return的缩进,也可能出现部分元素未被处理的情况。
修复方案
首先将return语句调整到函数最外层,确保所有键值对都能被遍历到;其次遍历集合时使用原集合的静态列表副本,避免迭代过程中修改原集合导致的异常;同时去掉裸except(裸except会捕获所有包括系统异常在内的错误,不利于排查问题),改为明确判断键是否存在于映射字典中。
修复后的完整代码如下:
def update_dict(parent_dict): for tbls in parent_dict.values(): # 遍历集合的列表副本,避免修改原集合干扰迭代器 for tbl in list(tbls): if "." in tbl: continue if tbl in pub_plat_dict: update_val = pub_plat_dict[tbl] tbls.remove(tbl) tbls.add(update_val) return parent_dict
运行验证
传入你提供的样例测试数据执行修复后的函数,输出结果完全符合预期:
{ '49d238407e0102ba': {'src_platform.opportunity_history'}, 'f9d53c74ec1d2ff6': {'servicer.trial_balance', 'src_platform.loan', 'src_platform.loan_disbursement'}, 'fc35a98e0cfaab3d': {'zodiac', 'src_platform.loan', 'src_platform_mosaic_live.loan_agreement', 'src_platform.opportunity_compliance_flag'} }
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

