【问题标题】:Check if key exists and get the value at the same time in Python?检查键是否存在并在Python中同时获取值?
【发布时间】:2015-07-07 19:03:07
【问题描述】:

有时我们可能需要验证字典中的键是否存在,如果对应的值存在则进行操作。

通常,我是这样进行的:

if key in my_dict:
    value = my_dict[key]
    # Do something

这当然可读性强,速度快,但从逻辑上看,它让我很困扰,因为相同的动作连续执行了两次。这是浪费时间。

当然,对字典中值的访问是摊销的,通常是瞬时的。但如果不是这样,我们需要重复多次怎么办?

我想到的第一个解决方法是使用.get() 并检查返回值是否不是默认值。

value = my_dict.get(key, default=None)
if value is not None:
    # Do Something

不幸的是,这不是很实用,如果密钥存在并且其对应的值恰好是None,则可能会导致问题。

另一种方法是使用 try / except 块。

try:
    value = my_dict[key]
    # Do something
except KeyError:
    pass

但是,我非常怀疑这是最好的方法。

还有其他我不知道的解决方案,还是我应该继续使用传统方法?

【问题讨论】:

  • 在 python try / except 中最接近“请求宽恕,而不是许可”范式。否则,您需要使用带有默认值的.get(),该默认值从不显示为您的字典的有效值。可能是float('-inf') 之类的东西?
  • 您可以尝试使用不太可能出现在数据中的默认值,例如 Ellipsis 类的对象,例如my_dict.get(key, ...).
  • try..except 可能是最好的、最 Pythonic 的方法(除非您预计会有很多失败的查找,在这种情况下 if 会更好)。
  • 在许多语言中,文化是异常仅用于错误,而不是正常的控制流。 Python 明确拒绝了这一点。甚至for 循环也是使用异常实现的;在 Python 中捕获非错误情况下的异常是完全正常的。

标签: python python-3.x dictionary


【解决方案1】:

如果缺失值的情况确实异常,那么异常处理是合适的:

try:
    value = my_dict[key]
    # Do something
except KeyError:
    pass

如果要同时处理丢失和存在的密钥,那么您的第一个选项很有用。

if key in my_dict:
    value = my_dict[key]
    # Do something

在这种特定情况下,使用get 并没有提供任何优势。相反,您必须找到一个不冲突的值来识别 missing key 条件。

【讨论】:

  • 您能否详细说明最后一句话?我想说value = my_dict.get(key, "") 很容易阅读并且代码更少。
  • @BartFriederichs 通常,您无法确定字典中不存在您的默认值,因此您可能无法区分有效键和无效键。那么你就不能按要求区别对待无效键了。
【解决方案2】:

正如多次提到的,异常处理是要走的路。但是,如果您想使用get 并且None 是一个可能的值,请创建一个新对象作为“未找到”标记。 (由于您刚刚创建了该对象,它不可能成为您的dict 中的有效条目。好吧,并非不可能,但您确实必须竭尽全力将其添加到dict。 )

sentinel = object()
value = my_dict.get(key, sentinel)
if value is not sentinel:
    # Do something with value

【讨论】:

    【解决方案3】:
    if (dict.get('key') is not None) and ('key' in dict):
        var = dict['key']
    

    if 语句的第二部分可能不是完全必要的,但我在自己的代码中使用了这种格式,它可以完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2022-07-12
      • 2014-01-30
      • 2013-08-07
      相关资源
      最近更新 更多