在Python字典中检查键是否存在且其值不为空字符串

28

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

  • 如果存在该键
  • 如果键的值不是空字符串

否则将默认值分配给变量。

我想使用 dict.get

my_value = dict.get(key, my_default)

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

然而,如果键存在且值为空字符串,则该方法会将一个空字符串赋值给my_value。以下方法是否更好:

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

使用空字符串的真实性来确保只有非空字符串被赋值给my_value

是否有更好的方法执行此检查?


1
dict.get 不会分配任何内容。 - Ashwini Chaudhary
dict.get() 不满足条件 #1。需要两个表达式。 - user2665694
我觉得这个问题的标题有误导性。这个问题是关于变量赋值的,而不是分支本身。 - rob
3个回答

37

也许你的意思是:

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的返回值。

我认为你的第二个例子正是我所描述的。希望我对问题的编辑能够稍微澄清一下。谢谢,这似乎是一个明智的一行解决方案。 - Jonathan Evans
1
@JonathanEvans -- 现在我理解了你的问题,我删除了我的答案的前一部分以避免混乱。 - mgilson
2
@JonathanEvans 没有必要在调用 get 时放置默认值,因为如果未指定,则 get 返回 None,这将导致真实性测试失败。 - Mark Ransom
2
a.get('foo',my_default) or my_defaulta.get('foo',my_default) 有什么不同? - kgf3JfUtW
1
好问题——这是一个边角情况。请参见 https://dev59.com/K1YN5IYBdhLWcg3w_sya - mgilson

19

您想做到的最简单的方法:

my_value = dict.get(key) or my_default

or会返回第一个非假值,否则返回第二个。与其他语言不同,Python不会强制结果为布尔类型,在某些情况下非常有用。


为了完整描述 or,如果两个值都是假的,or 返回第二个值 -- 0 or False - mgilson
@mgilson,观察得很好,我的or的描述不完整。我会修复它。 - Mark Ransom
这个答案比被接受的那个更加优雅,因为它避免了默认值的重复。 - azmeuk
这与 dict.get(key, my_default) 有何不同? - kgf3JfUtW
2
@sam,这个问题非常具体,关于如果字典包含空字符串时使用默认值的问题。通常,如果键完全“丢失”,get才会使用默认值。 - Mark Ransom

0

这对我有用

    try:
        post_profile = record['ownerUsername'] 

    except KeyError:
        post_profile = "nouserwasfound"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接