我想删除值为空的字典中的嵌套键。
示例:
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')]}}}
答案 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')]}}}