如果不存在,则访问 dictkey 并返回 Nothing

在 Python 中,最有效的方法是什么:

my_var = some_var['my_key'] | None

如果 some_var包含 'my_key',则将 some_var['my_key']分配给 my_var,否则将 my_var分配给 None

78402 次浏览
try:
my_var = some_var
except:
my_var = None

但说实话,这可能没有触及到你试图做的事情的核心... ... 我们需要更多的上下文来更全面地回答这个问题。

在 python 中,"|"被翻译成 "or",因此:

my_var = some_var or None

编辑:

你已经编辑了你最初的文章,正确的做法是:

my_var = some_var.get('my_key', None)

您正在寻找 dictget()方法。

my_var = some_var.get('some_key')

如果存在与 'some_key'关联的值,则 get()方法将返回该值。如果密钥不存在,则返回 None

假设 some_var是一本字典,那么您需要 dict.get():

my_var = some_var.get('my_key')

如果缺少 my_key,这个结果默认为 None,但是您可以提供一个不同的默认值:

my_var = some_var.get('my_key', default)

如果字典中没有这个键,Python 会抛出一个 KeyError,因此您不能用与 JavaScript 完全相同的方式编写代码。但是,如果您像在示例中一样使用 dicts 进行操作,那么有一个非常好的函数 mydict.get('key', default),它尝试从 dictionary 中获取键,并在键不存在时返回默认值。

如果只想默认为 None,则不需要显式传递第二个参数。

根据您的 dict 包含的内容以及预期访问未设置键的频率,您可能还有兴趣使用 collections包中的 defaultdict。这将获取一个工厂,并在访问未显式设置的键时使用它从 __missing__ Magic 方法返回新值。如果您的结果预期只包含一种类型,那么它特别有用。

from collections import defaultdict


foo = defaultdict(list)
bar = foo["unset"]
# bar is now a new empty list

注意,文档(2.7.13)声称,如果不向 defaultdict传递参数,它将返回未设置键的 None。当我尝试它(在2.7.10上,它只是我碰巧已经安装) ,它不工作,我收到了一个 KeyError。YMMV.或者,您可以只使用 lambda: defaultdict(lambda: None)

.get()方法的伟大之处在于,您可以实际定义一个值,以便在键不存在的情况下返回。

my_dict = { 1: 'one', 2: 'two' }
print my_dict.get(3, 'Undefined key')

会打印出来。

Undefined key

这不仅对于调试非常有帮助,而且对于解析 json (至少在我的经验中)也非常有帮助,您应该尽可能多地使用 get()而不是 []

对于 新的的结论:

from collections import defaultdict
# None is the default, but you can change this default value
d = defaultdict(lambda: None)

对于 存在的结论:

from collections import defaultdict
# convert a dictionary to a defaultdict
d = defaultdict(lambda: None,d)