我遇到了迭代和修改字典的问题......
说我有一本字典:
dict1 = {'A' : 'first', 'B' : 'second', 'C' : 'third', 'D' : 'fourth'}
我想迭代dict1,使用其中的数据构建第二个字典。完成dict1
中的每个条目后,我将其删除。
在伪代码中:
dict2 = {}
for an entry in dict1:
if key is A or B:
dict2[key] = dict1[key] # copy the dictionary entry
if key is C:
do this...
otherwise:
do something else...
del dict1[key]
我知道改变循环中迭代的长度会导致问题,而上述内容可能并不容易实现。
this question这个问题的答案似乎表明我可以使用keys()
函数,因为它返回一个动态对象。我已经尝试过了:
for k in dict1.keys():
if k == A or k == B:
dict2[k] = dict1[k]
elif k == C:
dothis()
else:
dosomethingelse()
del dict1[k]
但是,这只是给出了:
'RuntimeError:字典在迭代期间改变了大小'
第一次删除后。我也尝试过使用iter(dict1.keys())
,但也遇到了同样的错误。
因此我有点困惑,可以提出一些建议。感谢
答案 0 :(得分:3)
为什么不简单地dict1.clear()? 请注意,在循环中,每次迭代都会删除每个元素吗?
我能想到的一个简化(和天真)的解决方案是
delkeys=[]
dict2 = {}
for an entry in dict1:
if key is A or B:
dict2[key] = dict1[key] # copy the dictionary entry
if key is C:
do this...
elif:
do something else...
delkeys.append(key)
for x in delkeys:
del dict1[x]
答案 1 :(得分:1)
只需使用.keys()
方法创建一个独立的密钥列表。
以下是Python 2.7代码的工作版本:
>>> dict1 = {'A' : 'first', 'B' : 'second', 'C' : 'third', 'D' : 'fourth'}
>>> dict2 = {}
>>> for key in dict1.keys(): # this makes a separate list of keys
if key in ('A', 'B'):
dict2[key] = dict1[key]
elif key == 'C':
print 'Do this!'
else:
print 'Do something else'
del dict1[key]
Do this!
Do something else
>>> dict1
{}
>>> dict2
{'A': 'first', 'B': 'second'}
对于Python 3,在.keys()
周围添加 list()并使用print-function:
>>> dict1 = {'A' : 'first', 'B' : 'second', 'C' : 'third', 'D' : 'fourth'}
>>> dict2 = {}
>>> for key in list(dict1.keys()): # this makes a separate list of keys
if key in ('A', 'B'):
dict2[key] = dict1[key]
elif key == 'C':
print('Do this!')
else:
print('Do something else')
del dict1[key]
Do this!
Do something else
>>> dict1
{}
>>> dict2
{'A': 'first', 'B': 'second'}