【问题标题】:Is checking for the existence of a key in a dictionary better than catching a KeyError in Python?检查字典中键的存在是否比在 Python 中捕获 KeyError 更好?
【发布时间】:2012-06-21 00:06:00
【问题描述】:

我在 Python 方面有一些经验,但我正在参加 Udacity 计算机科学课程以填补我所学知识的空白并补充我已经知道的知识。本课程讨论了一个哈希表查找函数,如果键不在哈希表中,则该函数返回 None 作为键的值。当键不存在时,Python 的字典类型会抛出 KeyError,因此课程说在获取其值之前使用 key in mydict

我想知道这样做是否更好:

mydefaultval = 75
key = ..
mydict = ..
if key in mydict:
    val = mydict[key]
else:
    val = mydefaultval

.. 或

mydefaultval = 75
key = ..
mydict = ..
try:
    val = mydict[key]
except KeyError:
    val = mydefaultval

我想 Python 要检查密钥是否存在,它必须在字典中找到它。如果我然后抓住那个键的值,它必须做同样的事情两次。我这样想是正确的,还是 Python 会做其他事情?

【问题讨论】:

  • Ned 给了你正确的答案 - 但值得建议你不要隐藏内置插件(例如命名一个 dict - dict)。一般来说,Python 遵循“请求宽恕胜过许可”,而不是“先看再跳”的方法。即,先别看能不能做,试着做,做不到再处理。
  • @JonClements,对不起,忘记了。我只是想快速输入示例。
  • 虽然在你的情况下还有其他答案,但 Jon Clements 是对的 - 你几乎总是最好抓住异常 - 首先,它通常显示正确的优先级 - 你想要处理当一切都如你所愿首先,不要考虑支票。它还避免了各种情况下的竞争条件,这总是值得做的,因为如果它们滑入,它们是微妙而烦人的错误。
  • @Lattyware,这是我没有想到的另一件事。你是说在检查它的存在之后但在获取它的值之前,有可能删除密钥,对吧?
  • 是的 - 对于 dict 键之类的东西,这通常不是问题,但在涉及线程,或写入/读取文件的情况下,这是一个严重的问题。一般来说,最好坚持处理异常而不是事先检查,除非你绝对需要(例如,如果那段代码是一个重要的瓶颈并且异常情况实际上发生了很多 - 尽管注意异常情况是否发生最多有时,您也许可以交换例外情况作为替代方案 - 但显然,除非必须,否则永远不要优化。)。

标签: python hash hashmap hashtable


【解决方案1】:

最好的办法是使用dict.get:

val = my_dict.get(key, mydefaultval)

如果没有像这样很棒的方法,我建议使用异常。 Python 文化是不禁止异常,而且通常显式检查实际上会捕获异常。

【讨论】:

  • 您是否认为这适用于其他支持检查​​键但不支持获取默认值的功能的语言?
  • 如果它对性能至关重要并且没有像这样很棒的方法,那么只有在我预计该值通常存在时,我才会使用异常。但最好先编写最清晰的代码,然后在发现瓶颈时担心性能。
  • @StevenRumbalski,你的意思是反过来吗?仅当您希望该值通常不存在时才使用异常?
  • 另外,Ned,即使存在内置函数,也感谢您回答问题。
  • 值得注意的是 dict.get() 实现是 AFAIK 不是一成不变的。欢迎实现将其有效地构建为 try/except 块。不过,我已经很长时间没有深入研究 Python 实现的源代码了,所以他们可能会在幕后做一些更聪明的事情。
【解决方案2】:

如果每次使用特定字典时默认值都相同,则另一种选择是使用collections.defaultdict。声明 dict 比 dict.get() 解决方案更冗长,但使用更简洁:

>>> from collections import defaultdict
>>> mydict = defaultdict( lambda: 75 )
>>> mydict[3]
75

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2015-11-26
    相关资源
    最近更新 更多