检查无效密钥

时间:2012-10-12 21:10:06

标签: python

我有一个while循环:

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

我想用这个列表做的只是将父值的父值(已在代码的其他部分中确定)添加到列表中,直到我到达树的顶部并且没有更多的父项剩余。 while循环的工作原理是,一旦为parentMap [parent]提供了无效的[parent]键,它将被赋值为“None”,循环将终止。这不会发生。相反,一旦我到达最顶层的键(5,5),程序就会抛出一个错误,指出“无效密钥”。思考?

4 个答案:

答案 0 :(得分:5)

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

while parent is not None:
    pathList.append(parentMap[parent])
    parent = parentMap.get(parent, None) # returns None if key is not found

答案 1 :(得分:3)

正如其他人也指出的那样,问题在于,如果找不到密钥,dict不返回None,而是引发KeyError例外(as seen in the documentation)。

要解决此问题,您可以使用defaultdict中的collections并将None设置为该字典的默认值。我建议你阅读classes documentation

在这种情况下,您可以使用dictparentMap = dict(some_initializer)而不是将parentMap = {}初始化为parentMap = defaultdict(lambda: None, some_initializer)parentMap = defaultdict(lambda: None, {}),而丢失的密钥将返回{{1}而不是提出None例外。

在一个不相关的问题中,KeyError是一个单身人士,最好检查None而不是item is not None。在我的拙见中,它产生了更清晰的代码。

答案 2 :(得分:2)

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

应该可以正常工作

答案 3 :(得分:1)

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

这就是你在做什么?

编辑:要解决问题,请使用parentMap.get(parent, None)