Python迭代嵌套字典以删除键

时间:2017-03-29 06:34:49

标签: python loops dictionary

我想删除值为空的字典中的嵌套键。

示例:

d = {'A': {'a': {1: [('string1', 'string2')]}}, 
     'B': {'b': {}},
     'C': {}
    }

对于每个主键,有一个子键和一个子子键。 如果任何键的值为空,我想删除整个键。

然而,我收到错误:RuntimeError: dictionary changed size during iteration 当我遍历字典以删除空值时。

for k,v in d.iteritems():
    if not v:
        del d[k]
    else:
        for a,b in v.iteritems():
        if not b:
            del d[k][a]

期望的输出:

d = {'A': {'a': {1: [('string1', 'string2')]}}}

4 个答案:

答案 0 :(得分:2)

您可以创建字典的相同深层副本。以下是相同的解决方案。

friends

所以,d2给你需要的词典。

答案 1 :(得分:1)

正如其他人所指出的那样,当您迭代迭代时,您正在修改迭代。相反,您可以制作字典的深层副本以进行迭代,这样您就可以编辑原始数据结构的内容。

import copy
d = {'A': {'a': {1: [('string1', 'string2')]}},
     'B': {'b': {}},
     'C': {}
    }

for k,v in copy.deepcopy(d).items():
    if not v:
        del d[k]
    else:
        for a,b in v.items():
            if not b:
                del d[k]

出:

{'A': {'a': {1: [('string1', 'string2')]}}}

答案 2 :(得分:0)

for k, v in d.items():

  if not v:
    del d[k]
  else:
    for a,b in v.items():
        if not b:
            if len(d[k])==1:
                del d[k][a]
                del d[k]
            else:
                del d[k][a]
print d

答案 3 :(得分:0)

这是解决您的问题

old_d = {'A': {'a': {1: [('string1', 'string2')]}}, 
 'B': {'b': {}},
 'C': {}
}

new_d ={}

for k,v in old_d.iteritems():
print k
print v
if v:
    for a,b in v.iteritems():
        if b:
            new_d[k]=v
            new_d[k][a]=b
old_d = new_d
print "old_d", old_d

输出:old_d {'A': {'a': {1: [('string1', 'string2')]}}}