【发布时间】: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, ...). -
在 Python 中,
try/exceptIS the way (correct, accepted, and normal) to do this。与此方法相关的样式even has its own name。 -
try..except可能是最好的、最 Pythonic 的方法(除非您预计会有很多失败的查找,在这种情况下if会更好)。 -
在许多语言中,文化是异常仅用于错误,而不是正常的控制流。 Python 明确拒绝了这一点。甚至
for循环也是使用异常实现的;在 Python 中捕获非错误情况下的异常是完全正常的。
标签: python python-3.x dictionary