迭代时更新字典

时间:2019-04-14 11:08:33

标签: python-3.x dictionary

是否有一种方法可以在迭代过程中更新字典以避免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'

但这会使我弹出要保留的项目。由于我打算使用大型词典,所以在这里最好的选择是什么?

1 个答案:

答案 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}}