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
相关产品推荐
相关产品推荐

