【问题标题】:Checking for Invalid Key检查无效密钥
【发布时间】:2012-10-13 05:43:41
【问题描述】:

我有一个while循环:

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

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

【问题讨论】:

    标签: python


    【解决方案1】:

    如果在map中找不到key,你可以使用get方法返回一个默认值:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:
        while parent != None:
              try:
                   pathList.append(parentMap[parent])
                   parent = parentMap[parent]
              except KeyError:
                   parent = None
        

        应该没问题

        【讨论】:

          【解决方案4】:

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

          这就是你在做的吗?

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

          【讨论】:

          • 是的(我认为它不会抛出错误,而只是分配一个 None 值),但我不确定如何改善这种情况。如果我将最高值的父项初始化为 None,那么它会尝试将 None 映射到列表中,然后事情再次变得混乱......
          • Joran 或 John 的方法都可以修复它。我个人会选择 John's,因为我被教导避免 try/except 是一种很好的做法,但两者都应该有效。
          • 另请注意,John 的解决方案使用is not None 而不是!= None,这也是更好的样式。
          猜你喜欢
          • 2017-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-30
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          相关资源
          最近更新 更多