正在检查无效密钥

2024-09-23 16:23:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个while循环:

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

我想对这个列表做的只是简单地将父值的父值(已经在代码的其他部分中确定)添加到列表中,直到我到达树的顶部,并且不再有父级。while循环的工作原理是,一旦parentMap[parent]被提供了一个无效的[parent]键,它将被赋值为“None”,循环将终止。这不会发生的。相反,一旦我找到了最上面的键(5,5),程序就会抛出一个错误,声明“无效的键”?在


Tags: 代码程序none声明列表错误parent原理
3条回答

正如其他人所指出的,问题在于如果找不到键,dict不会返回{},而是引发一个KeyError异常(as seen in the documentation)。在

为了克服这个问题,您可以使用defaultdictfromcollections并将None设置为该dict的默认值。我建议您阅读classes documentation。在

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

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

如果在映射中找不到键,可以使用get方法返回默认值:

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

应该可以正常工作

相关问题 更多 >