是否有一种方法可以在迭代过程中更新字典以避免RuntimeError: dictionary changed size during iteration
?
如果条件成立,我想做的就是在内部字典中弹出一些键。对于实例,给出以下字典:
D = {'a': {'s': 1,'b': 2}, 's': {'a': -1, 'c': 3}, 'b': {'z': 2, 'x': 4, 'a': -2}}
我想要得到的是:
D = {'a': {'s': 1,'b': 2}, 's': {'c': 3}, 'b': {'z': 2, 'x': 4}}
请注意,在's'
和'b'
字典中,值'a'
的键在内部字典中消失了,因为D中已经有一个值a
的键,其键为{{1} }和's'
作为值。
到目前为止我尝试过的事情:
'b'
该条件应检查内部字典中是否假设for k, v in D.items():
for i, j in v.items():
if i in D and k in D[i]:
D.pop(i)
内部字典已经具有's'
,而实际上这是'key'
字典中的'key'
。这里没有考虑顺序。因此,应删除D
内部字典's'
,因为内部字典中实际上有一个'a'
的{{1}}。 D['a']
内部字典具有相同的逻辑,因为内部's'
中有'b'
'a'
,而key
具有'b'
,我想从D['a']
中删除'b'
,然后保留'a'
但这会使我弹出要保留的项目。由于我打算使用大型词典,所以在这里最好的选择是什么?
答案 0 :(得分:0)
如果我理解正确,您希望删除D的内部字典中已在D中为其定义了键的每个条目。请注意,即使将Python字典作为字典,此处也将字典视为有序序列本质上是无序的。
与其在迭代过程中尝试修改现有字典,不如创建一个新字典并将值附加到for
循环中。
有效的实现方式:
D = {'a': {'s': 1,'b': 2}, 's': {'a': -1, 'c': 3}, 'b': {'z': 2, 'x': 4, 'a': -2}}
newdict = {}
for k_outer,v_outer in D.items():
newdict[k_outer] = {}
for k_inner,v_inner in v_outer.items():
if k_inner not in newdict.keys():
newdict[k_outer][k_inner] = v_inner
print(newdict)
D = newdict
输出:
{'a': {'s': 1, 'b': 2}, 's': {'c': 3}, 'b': {'z': 2, 'x': 4}}
或者,如果您绝对想即时修改D,请使用.copy()
,它允许您在循环内修改原始字典的同时迭代原始字典的副本:
D = {'a': {'s': 1,'b': 2}, 's': {'a': -1, 'c': 3}, 'b': {'z': 2, 'x': 4, 'a': -2}}
seen = []
for k_outer,v_outer in D.copy().items():
seen.append(k_outer)
for k_inner,v_inner in v_outer.copy().items():
if k_inner in seen:
D[k_outer].pop(k_inner)
print(D)
输出:
{'a': {'s': 1, 'b': 2}, 's': {'c': 3}, 'b': {'z': 2, 'x': 4}}