Iterating through and mutating dictionary
我遇到了反复阅读和修改字典的问题…
假设我有一本字典:
1 | dict1 = {'A' : 'first', 'B' : 'second', 'C' : 'third', 'D' : 'fourth'} |
我想迭代dict1,使用其中的数据构建第二个字典。一旦完成了EDOCX1中的每个条目(0),我就删除它。
在伪代码中:
1 2 3 4 5 6 7 8 9 10 | 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] |
号
我知道改变一个循环中一个不可数的长度会引起问题,而上述的问题可能并不容易实现。
这个问题的答案似乎表明我可以使用
1 2 3 4 5 6 7 8 | 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: dictionary changed size during iteration'
号
第一次删除后。我也尝试过使用
所以我有点困惑,可以接受一些建议。谢谢
为什么不简单地dict1.clear()?注意到在循环中每次迭代都会删除每个元素吗?
我能想到的一个简单(天真)的解决方案是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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] |
只需使用
下面是您的python 2.7代码的工作版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | >>> 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,在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | >>> 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'} |