检查一个键是不是存在并且它的值不是 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_default
与 a.get('foo',my_default)
有何不同?
好问题——这是一个极端案例。见***.com/q/46546872/748858以上是关于检查一个键是不是存在并且它的值不是 Python 字典中的空字符串的主要内容,如果未能解决你的问题,请参考以下文章