0

我有一个while循环:

while parent != None:
     pathList.append(parentMap[parent])
     parent = parentMap[parent]

我想要对这个列表做的只是将父值的父值(已经在代码的其他部分确定)添加到列表中,直到我到达树的顶部并且没有更多的父值。while 循环的运行理念是,一旦给 parentMap[parent] 提供了一个无效的 [parent] 键,它将被赋值为“None”并且循环将终止。这不会发生。相反,一旦我到达最上面的键 (5, 5),程序就会抛出一个错误,指出“无效键”。想法?

4

4 回答 4

6

get如果在地图中找不到键,您可以使用该方法返回默认值:

while parent is not None:
    pathList.append(parentMap[parent])
    parent = parentMap.get(parent, None) # returns None if key is not found
于 2012-10-12T21:24:32.720 回答
4

正如其他人也指出的那样,问题在于如果找不到密钥 adict不会返回None,而是引发KeyError异常(如文档中所示)。

为了克服这个问题,您可以使用defaultdictfromcollections并将其设置None为该字典的默认值。我建议您阅读类文档

在这种情况下,而不是初始化您的dictasparentMap = dict(some_initializer)parentMap = {}您可以使用parentMap = defaultdict(lambda: None, some_initializer)orparentMap = defaultdict(lambda: None, {})和缺少的键将返回None而不是引发KeyError异常。

在一个不相关的问题中,None是一个单例,最好检查一个item is not None而不是使用!=. 在我看来,它会生成更清晰的代码。

于 2012-10-12T21:23:58.240 回答
2
while parent != None:
      try:
           pathList.append(parentMap[parent])
           parent = parentMap[parent]
      except KeyError:
           parent = None

应该可以正常工作

于 2012-10-12T21:22:51.737 回答
1

好吧,您收到错误说明invalid key的原因可能是因为您没有将parentMap[parent]顶级父级分配给None,您只是没有将其放入地图中。由于它不在地图中,因此默认行为是抛出invalid key错误。

那是你在做什么?

编辑:要补救,请使用parentMap.get(parent, None)

于 2012-10-12T21:13:03.233 回答