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

Python迭代字典修改大小触发RuntimeError,求子字典匹配删除方案

解决字典迭代修改触发的RuntimeError问题

首先明确:Python字典的键是唯一的,你定义的e = {'a':{'aa':'yes'}, 'b':{'ac':'no'}, 'a':{'aa':'yes'}}实际运行后,e会变成{'a': {'aa': 'yes'}, 'b': {'ac': 'no'}},后面的'a'键会直接覆盖前面的,这点要注意。

你遇到的RuntimeError: dictionary changed size during iteration,是因为遍历e.items()时直接删除字典键,迭代器依赖原字典的大小,中途修改会导致迭代逻辑混乱。下面给两种实用解决办法:

方法一:遍历字典键的副本

把要遍历的键转成列表(生成一个独立副本),这样迭代的是副本,原字典的修改不会影响迭代过程:

e = {'a':{'aa':'yes'}, 'b':{'ac':'no'}}
f = {'a':{'aa':'yes'}, 'e':{'ab':'no'}}

# 遍历e的键的副本,避免迭代时原字典变化报错
for key in list(e.keys()):
    current_val = e[key]
    # 检查f中是否有匹配的子字典值
    for f_val in f.values():
        if current_val.get('aa') == f_val.get('aa'):
            e.pop(key)
            break  # 找到匹配就停止检查,避免重复操作

print(e)  # 输出: {'b': {'ac': 'no'}}

方法二:生成新字典(更推荐)

直接创建新字典,只保留不符合删除条件的键值对,逻辑清晰且避免迭代冲突,大字典场景下效率更高:

e = {'a':{'aa':'yes'}, 'b':{'ac':'no'}}
f = {'a':{'aa':'yes'}, 'e':{'ab':'no'}}

# 先收集f中所有子字典的'aa'值,用集合去重提升查找效率
f_aa_values = {val.get('aa') for val in f.values()}

# 用字典推导式过滤出需要保留的项
e = {k: v for k, v in e.items() if v.get('aa') not in f_aa_values}

print(e)  # 输出: {'b': {'ac': 'no'}}

内容的提问来源于stack exchange,提问作者Working dollar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:15:25