我有一个嵌套字典,如下所示:
g = {
'a': {
1.55: {
'CD': [1.55, 12],
'LM': [1.55, 12],
},
1.45: {
'AF': [1.45, 15],
},
1.6: {
'NR': [1.6, 26],
}
}
}
我想搜索每个元素,如果列表中有12,则将其删除。我编写了以下代码,但获得了TypeError
。我想知道是否有人可以提供帮助。
for e, p in g.iteritems():
for p,o in g[e].iteritems():
if g[e][p][o][1]==12:
del g[e][p][o]
答案 0 :(得分:2)
您当前的问题是,o
是一个字典,而不是密钥,因此使用o
建立索引会导致KeyError
。您可以通过输入打印声明来看到:
for e, p in g.iteritems():
for p,o in g[e].iteritems():
print(o)
产量
{'LM': [1.55, 12], 'CD': [1.55, 12]}
所以g[e][p][o]
引发了一个KeyError。您需要通过添加另一个for循环遍历o
项:
for q, r in o.iteritems():
但是,如果将其添加到代码中,则会遇到RunTimeError: dictionary changed size during iteration
。
这是因为我们在迭代o
中的项目时从o
删除键值对。 Python不喜欢这样。
您可以通过使用词典理解构建所需的词典来完全迭代g
,从而避免从g
删除项目的问题:
g={'a':{1.55: {'CD': [1.55, 12], 'LM': [1.55, 12]}, 1.45: {'AF': [1.45, 15]}, 1.6: {'NR': [1.6, 26]}}}
g = {k1: {k2: {k3: v3 for k3, v3 in v2.iteritems() if v3[1] != 12}
for k2, v2 in g[k1].iteritems()
} for k1, v1 in g.iteritems()}
print(g)
# {'a': {1.55: {}, 1.45: {'AF': [1.45, 15]}, 1.6: {'NR': [1.6, 26]}}}
答案 1 :(得分:1)
由于o
是字典,因此您无法将其用作索引,这就是您收到TypeError
的原因。
以下代码可以满足您的需求,但我建议您考虑一种更好的方式来组织数据。
for k1 in g.keys():
for k2 in g[k1].keys():
for k3 in g[k1][k2].keys():
if 12 in g[k1][k2][k3]:
del g[k1][k2][k3]
请注意,您需要使用.keys()
代替.iterkeys()
来避免RuntimeError: dictionary changed size during iteration
。同样,在@ Eric的解决方案.items()
应该使用而不是.iteritems()