0

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

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]
4

2 回答 2

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。o您需要通过添加另一个 for 循环来遍历 的项目:

    for q, r in o.iteritems():

但是,如果您将其添加到您的代码中,您将遇到一个RunTimeError: dictionary changed size during iteration. 这是因为我们o在迭代o. Python 不喜欢这样。

您可以通过使用 dict 理解来构建所需的 dict ,从而避免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]}}}
于 2013-05-14T18:55:36.860 回答
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()

于 2013-05-14T18:51:52.160 回答