TypeError删除嵌套字典中的项目

时间:2013-05-14 18:37:32

标签: python for-loop floating-point

我有一个嵌套字典,如下所示:

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]

2 个答案:

答案 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()

相关问题