2017-08-29 62 views
-1

我想删除了多层次键删除一个关键形式的多层次字典。我的代码来创建字典低于:从字典

from collections import defaultdict 

f = lambda: defaultdict(f) 
d = f() 
d['A']['B1']['C1'] = 1 
d['A']['B1']['C2'] = 2 
d['A']['B1']['C3'] = 3 
d['A']['B2']['C1'] = 15 
d['A']['B2']['C2'] = 20 

现在我想删除“C3”键。在字典中的最终结构为:

{ 
    "A": { 
     "B1": { 
      "C1": 1, 
      "C2": 2 
     }, 
     "B2": { 
      "C1": 15, 
      "C2": 20 
     } 
    } 
} 

我尝试:

for level_1_key, level_1_dct in d.items(): 
    for level_2_key, level_2_dct in level_1_dct.items(): 
     for level_3_key, level_value in level_2_dct.items(): 
      if level_value == 3:      
       d[level_1_key][level_2_key].pop(level_3_key, 'None') 

,当运行上面的代码我收到以下错误:

RuntimeError: dictionary changed size during iteration 

所以,任何人都可以请帮助我来解决和理解这个问题。

+0

您不得在迭代期间删除它。以某种方式将其标记为已删除并在循环外部删除 –

+0

为列表level_3_key中的items' ::'制作副本(level_2_dct.items()):'或重建理解词典 –

回答

0

错误消息告诉你到底是什么问题。您正在尝试删除该项目,而您仍在迭代python中无法实现的字典。相反,您应该保留对项目路径的引用并在迭代完成后将其删除:

paths = [] 
for level_1_key, level_1_dct in d.items(): 
    for level_2_key, level_2_dct in level_1_dct.items(): 
     for level_3_key, level_value in level_2_dct.items(): 
      if level_value == 3: 
       paths.append((level_1_key, level_2_key, level_3_key)) 

for lvl1, lvl2, lvl3 in paths: 
    d[lvl1][lvl2].pop(lvl3, None)