比对字典值(列表)与另一列表时修改Python字典键的方法
解决字典迭代修改报错与键替换方案
你碰到的dictionary changed size during iteration错误,核心原因是在遍历字典键的过程中直接修改了字典结构——Python字典的迭代依赖当前字典的状态,迭代时字典大小变化会打破迭代一致性,所以抛出了这个错误。
最推荐方案:创建新字典(简洁不易出错)
创建新字典是最稳妥的方式,逻辑清晰且不会有迭代冲突问题,你的字典只有100个键,性能完全不用担心。
通用匹配版本(核心名在原键任意位置都适用)
# 初始化新字典 new_dict = {} # 处理list1中的核心名,匹配并替换键 for core_name in list1: # 遍历原字典寻找对应键 for original_key in dict1: if core_name in original_key: new_dict[core_name] = dict1[original_key] break # 假设每个核心名仅对应一个原键,找到即停止 # 保留dict1中未被list1匹配到的键 for original_key in dict1: is_matched = any(core in original_key for core in list1) if not is_matched: new_dict[original_key] = dict1[original_key] # 替换原字典 dict1 = new_dict
优化版本(原键格式固定时使用)
如果你的原键格式固定为"/*** {core_name} ***/",可以直接构造原键查找,省去嵌套循环,效率更高:
new_dict = {} for core_name in list1: # 构造对应的目标原键 target_key = f"/*** {core_name} ***/" if target_key in dict1: new_dict[core_name] = dict1.pop(target_key) # 加入未匹配的剩余键 new_dict.update(dict1) dict1 = new_dict
原地修改字典方案(不创建新字典)
如果你确实不想创建新字典,也可以实现——只需遍历原字典键的副本(比如把键转为列表),这样迭代的是固定列表,不会受后续字典修改影响:
for core_name in list1: # 遍历原字典键的静态副本,避免迭代时字典变化的影响 for original_key in list(dict1.keys()): if core_name in original_key: # 迁移值并删除原键 dict1[core_name] = dict1.pop(original_key) break # 找到匹配键即停止
关于你的补充问题:是否只能创建新字典?
不是必须的,但创建新字典是更推荐的方式。原地修改虽然可行,但如果逻辑处理不当(比如多个原键匹配同一核心名、重复处理等),容易引入隐藏bug;而新字典的方式逻辑更直观,代码更容易维护,对于100个键的规模来说,性能差异可以忽略不计。
内容的提问来源于stack exchange,提问作者Dany
相关产品推荐
相关产品推荐

