检查一个键是不是存在并且它的值不是 Python 字典中的空字符串

Posted

技术标签:

【中文标题】检查一个键是不是存在并且它的值不是 Python 字典中的空字符串【英文标题】:Checking if a key exists and its value is not an empty string in a Python dictionary检查一个键是否存在并且它的值不是 Python 字典中的空字符串 【发布时间】:2012-12-28 16:25:37 【问题描述】:

对于从 Python 字典中的键/值对分配变量是否有明确的最佳实践:

如果密钥存在 如果键的值不是空字符串

否则为变量分配一个默认值。

我想使用dict.get:

my_value = dict.get(key, my_default)

但是,如果键存在且值为空字符串,则这会将空字符串分配给 my_value。使用以下内容是否更好:

if key in dict and dict[key]:
    my_value = dict[key]
else:
    my_value = my_default

这将利用空字符串的真实性来确保仅将非空字符串分配给my_value

有没有更好的方法来执行此检查?

【问题讨论】:

dict.get 没有分配任何东西。 dict.get() 不满足条件 #1。 需要两个表达式 我觉得这个问题的标题有误导性。这个问题特定于变量分配,而不是分支本身。 【参考方案1】:

做你想做的最简单的方法:

my_value = dict.get(key) or my_default

如果or 评估为非假,则将提供第一个值,否则将提供第二个值。与其他语言不同,Python 不会强制结果为布尔值,这有时是一个非常有用的属性。

【讨论】:

为了完成你对or的描述,如果两个值都是假的,or提供第二个——0 or False @mgilson,很好的观察,我对or 的描述不完整。我会解决的。 这个答案比公认的更优雅,因为它避免了默认值重复。 这与dict.get(key, my_default)有何不同? @sam 如果字典包含空字符串,则问题非常具体,即使用默认值。通常get 仅在密钥完全缺失时才使用默认值。【参考方案2】:

也许你的意思是这样的:

a.get('foo',my_default) or my_default

我认为这应该等同于您拥有的 if-else 条件

例如

>>> a = 'foo':''
>>> a.get('foo','bar') or 'bar'
'bar'
>>> a['foo'] = 'baz'
>>> a.get('foo','bar') or 'bar'
'baz'
>>> a.get('qux','bar') or 'bar'
'bar'

与其他版本相比,它的优势非常明显。这很好,因为您只需要执行一次查找,并且因为 or 短路(一旦它达到 True 类似的值,它就会返回它。如果没有找到类似 True 的值,or 返回第二个)。

如果你的默认值是一个函数,可以调用两次,如果你把它写成:d.get('foo',func()) or func()。在这种情况下,最好使用一个临时变量来保存func 的返回值。

【讨论】:

我认为你的第二个例子正是我所描述的。希望我对问题的编辑可以澄清这一点。谢谢,这似乎是一个明智的单行解决方案。 @JonathanEvans -- 现在我理解了你的问题,我删除了答案的第一部分以避免混乱。 @JonathanEvans 没有必要将默认值放在对get 的调用中,因为如果未指定get 将返回None,这将无法通过真实测试。 a.get('foo',my_default) or my_defaulta.get('foo',my_default) 有何不同? 好问题——这是一个极端案例。见***.com/q/46546872/748858

以上是关于检查一个键是不是存在并且它的值不是 Python 字典中的空字符串的主要内容,如果未能解决你的问题,请参考以下文章

检查 PHP cookie 是不是存在,如果没有设置它的值

如何检查哈希中是不是存在特定键?

即使未定义,也检查嵌套键是不是存在[重复]

检查对象中是不是存在键[重复]

检查是不是存在与正则表达式匹配的数组键

如何检查 **kwargs 中的键是不是存在?