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

比对字典值(列表)与另一列表时修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:00:27