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

Jon*_*ans 19 python string dictionary

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

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

否则为变量分配默认值.

我想用dict.get:

my_value = dict.get(key, my_default)
Run Code Online (Sandbox Code Playgroud)

但是my_value如果键存在且值为空字符串,则会为其分配一个空字符串.使用以下内容是否更好:

if key in dict and dict[key]:
    my_value = dict[key]
else:
    my_value = my_default
Run Code Online (Sandbox Code Playgroud)

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

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

mgi*_*son 26

也许你的意思是:

a.get('foo',my_default) or my_default
Run Code Online (Sandbox Code Playgroud)

我认为应该等同于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'
Run Code Online (Sandbox Code Playgroud)

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

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

  • @JonathanEvans没有必要将默认值放在调用`get`中,因为如果未指定,`get`将返回`None`,这将导致truthy测试失败. (2认同)
  • `a.get('foo',my_default) 或 my_default` 与 `a.get('foo',my_default)` 有何不同? (2认同)

Mar*_*som 13

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

my_value = dict.get(key) or my_default
Run Code Online (Sandbox Code Playgroud)

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

  • @sam如果字典包含空字符串,那么问题就是使用默认值非常具体.通常`get`只使用默认值,如果键完全*缺失*. (2认同)