Python3需用pop()删字典M开头键 遍历报RuntimeError求解
报错原因
Python 3 中dict.items()返回的是字典的动态视图对象,遍历过程中如果对原字典执行增、删操作改变字典大小,迭代器会直接检测到结构变化,抛出RuntimeError: dictionary changed size during iteration错误。在遍历原字典的循环里直接调用pop()删除条目,就触发了这个保护机制。
注意:原有代码里states.pop(key, val)的第二个参数是键不存在时pop的返回默认值,删除已确认存在的键时不需要传入这个参数。
正确实现(强制使用pop()方法)
核心思路是不要直接遍历原字典的动态视图,而是遍历静态的键序列,避免迭代过程和字典修改操作冲突。
方法1:遍历键的列表副本
循环启动前先把字典所有键转为静态列表,后续遍历这个独立列表时,修改原字典不会影响迭代流程:
states = { 'AK': 'Alaska', 'AL': 'Alabama', 'AR': 'Arkansas', 'MN': 'Minnesota', 'MO': 'Missouri', 'MP': 'Northern Mariana Islands', 'MS': 'Mississippi', } for key in list(states.keys()): if key.startswith('M'): # 用startswith比取key[0]更严谨,可避免空键触发索引错误 states.pop(key)
方法2:先收集待删除键再统一删除
先遍历一次字典把所有符合删除条件的键存到独立列表,再遍历这个待删列表执行pop操作:
states = { 'AK': 'Alaska', 'AL': 'Alabama', 'AR': 'Arkansas', 'MN': 'Minnesota', 'MO': 'Missouri', 'MP': 'Northern Mariana Islands', 'MS': 'Mississippi', } # 收集所有M开头的键 del_keys = [k for k in states if k.startswith('M')] for key in del_keys: states.pop(key)
两种方法执行完成后,原字典剩余内容为:
{'AK': 'Alaska', 'AL': 'Alabama', 'AR': 'Arkansas'}
内容的提问来源于stack exchange,提问作者Alejandro CM
相关产品推荐
相关产品推荐

