检查密钥是否存在并在Python中同时获取值?

Check if key exists and get the value at the same time in Python?

有时,我们可能需要验证字典中是否存在某个键,并在相应的值存在的情况下生成一些东西。

通常,我这样做:

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

当然,这是可读性和快速性很强的,但从逻辑的角度来看,它困扰着我,因为同一个动作连续执行两次。这是浪费时间。

当然,对字典中的值的访问是分摊的,并且通常是即时的。但如果不是这样,我们需要重复多次呢?

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

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

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

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

1
2
3
4
5
try:
    value = my_dict[key]
    # Do something
except KeyError:
    pass

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

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


如果缺少值的情况确实异常,则异常处理是适当的:

1
2
3
4
5
try:
    value = my_dict[key]
    # Do something
except KeyError:
    pass

如果要处理丢失和当前的密钥,那么第一个选项很有用。

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

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


如前几次所述,异常处理是一种方法。但是,如果你想使用getNone是一个可能的值,创建一个新的对象作为"未找到"的哨兵。(因为您刚刚创建了对象,所以它不可能是您的dict中的有效条目。好吧,这不是不可能的,但你真的需要不遗余力地把它添加到dict中。)

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


1
2
if (dict.get('key') is not None) and ('key' in dict):
    var = dict['key']

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