我有一个while循环:
while parent != None:
pathList.append(parentMap[parent])
parent = parentMap[parent]
我想用这个列表做的只是将父值的父值(已在代码的其他部分中确定)添加到列表中,直到我到达树的顶部并且没有更多的父项剩余。 while循环的工作原理是,一旦为parentMap [parent]提供了无效的[parent]键,它将被赋值为“None”,循环将终止。这不会发生。相反,一旦我到达最顶层的键(5,5),程序就会抛出一个错误,指出“无效密钥”。思考?
答案 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。
在这种情况下,您可以使用dict
或parentMap = 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)