Python字典循环调用.pop()触发报错,该如何解决?
Python字典遍历中调用
.pop()报错的解决方法 报错原因
直接遍历字典时,迭代器是基于当前字典的状态生成的。如果在循环过程中调用.pop()修改字典的大小,迭代器会检测到字典结构发生变化,从而触发RuntimeError: dictionary changed size during iteration。另外需要注意:Python字典的键具有唯一性,你原代码中重复的"PERSON2"键会被自动覆盖,实际字典中仅保留最后一个"PERSON2"条目。
解决方法
方法一:遍历字典键的副本
将字典的键转换为列表(创建一个独立副本),循环时迭代这个副本,这样原字典的修改不会影响迭代过程:
randomDictionary = { "PERSON1":{"NAME":"Cheese man","AGE":24}, "PERSON2":{"NAME":"Pepsi Man","AGE":26}, "PERSON3":{"NAME":"Something else man","AGE":30}, } # 遍历键的列表副本 for i in list(randomDictionary.keys()): if randomDictionary[i]["NAME"] == "Pepsi Man": randomDictionary.pop(i) print(randomDictionary)
方法二:创建新字典过滤目标条目
不修改原字典,通过字典推导式生成一个排除目标条目的新字典,这种方式更安全,避免原地修改带来的副作用:
randomDictionary = { "PERSON1":{"NAME":"Cheese man","AGE":24}, "PERSON2":{"NAME":"Pepsi Man","AGE":26}, "PERSON3":{"NAME":"Something else man","AGE":30}, } # 生成新字典,排除NAME为Pepsi Man的条目 filtered_dict = {key: val for key, val in randomDictionary.items() if val["NAME"] != "Pepsi Man"} print(filtered_dict)
方法三:手动控制迭代器(不推荐)
通过iter()生成迭代器,配合while循环手动处理迭代过程,这种写法相对繁琐,仅适合特殊场景:
randomDictionary = { "PERSON1":{"NAME":"Cheese man","AGE":24}, "PERSON2":{"NAME":"Pepsi Man","AGE":26}, "PERSON3":{"NAME":"Something else man","AGE":30}, } iterator = iter(randomDictionary.items()) while True: try: key, val = next(iterator) if val["NAME"] == "Pepsi Man": randomDictionary.pop(key) except StopIteration: break print(randomDictionary)
内容的提问来源于stack exchange,提问作者Neoro
相关产品推荐
相关产品推荐

