我试图在迭代字典时从字典中删除一个键。从字典中删除键时,我得到:
RuntimeError: dictionary changed size during iteration
我的代码:
mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
for k, v in mydict.items():
if k == 'two':
del(mydict[k])
continue
print(k)
为了避免这种情况,我将同一字典复制到另一个字典,然后在迭代前一个字典时尝试从复制的字典中删除内容。但我仍然收到错误。
mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
new_dict = mydict
for k, v in mydict.items():
if k == 'two':
del(new_dict[k])
continue
print(k)
所以任何人都可以帮助解决这个问题。
你收到此错误是因为你无法在迭代字典本身的同时修改字典。Python 不会跟踪你对字典所做的更改,并且当你继续迭代时,它会混淆,因为它不再与迭代开始时的字典相同。
以下是解决此问题的两种方法:
1. 使用字典推导式创建新字典:
这是最 Pythonic 的方法。你可以使用字典推导式创建一个新的字典,其中只包含你想要保留的项:
mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
mydict = {k: v for k, v in mydict.items() if k != 'two'}
print(mydict)
此代码创建一个新的字典
mydict
,该字典包含原始字典中除
'two'
以外的所有键值对。
2. 迭代字典副本:
你可以创建一个字典副本并迭代该副本,同时修改原始字典。这允许你修改原始字典,而不会在迭代过程中遇到问题。
mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
for k, v in mydict.copy().items():
if k == 'two':
del mydict[k]
print(mydict)
此代码迭代字典副本 (
mydict.copy()
),如果键等于
'two'
,它会从原始字典
mydict
中删除该项。
这两种方法都可以实现你想要的结果,而不会引发“RuntimeError”。选择哪种方法取决于你的个人喜好和代码的具体上下文。
标签:python,python-3.x,dictionary From: 49444511