访问字典键并在不存在时返回None

80
在Python中,最有效的方法是什么来完成这个任务:
my_var = some_var['my_key'] | None

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


1
"if it exists" 是什么意思?在某些情况下,变量名 some_var 可能未定义吗? - Sven Marnach
1
我刚刚编辑了一下 - 为了澄清 - 我正在尝试检查字典中是否存在一个键。 - 9-bits
my_var = some_var.get('my_key') - Seraf
7个回答

81

如果字典中不存在某个键,Python 会抛出一个 KeyError 异常,所以你不能像在 JavaScript 中那样编写代码。但是,如果你像你的例子一样专门操作字典,有一个非常好用的函数 mydict.get('key', default),它会尝试从字典中获取键并在键不存在时返回默认值。

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

根据字典包含的内容和你期望访问未设置键的频率,你可能还想使用 collections 包中的 defaultdict。这个函数接受一个工厂函数,并在访问未设置键时使用它来返回新值。当你的字典预计仅包含一种类型时,这个函数特别有用。

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。因此,您可以使用一个lambda表达式:defaultdict(lambda: None)


4
当你在字典中访问不存在的键时,会引发 KeyError 异常。 - farthVader

66
你正在寻找字典 dictget() 方法。
my_var = some_var.get('some_key')

get() 方法用于返回关联于 'some_key' 的值,如果存在该值。如果键不存在,则返回 None


18

.get()方法的好处是,你可以定义一个在键不存在时返回的值。

my_dict = { 1: 'one', 2: 'two' }
print my_dict.get(3, 'Undefined key')
将会打印。
Undefined key

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


17

假设 some_var 是一个字典,你需要使用dict.get()方法:

my_var = some_var.get('my_key')

如果缺少 my_key,则此结果默认为None,但您可以提供不同的默认值:

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

9

在Python中,"|"被翻译为"or",因此:

my_var = some_var or None

编辑:

您已经编辑了您的初始帖子。您想做的正确方法是:

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

1
无用的是None,缺省值是None --> http://docs.python.org/library/stdtypes.html#typesmapping - Fred
1
这只是一个例子,用来说明 dict.get 的使用方法。 - S. Developer

2
try:
    my_var = some_var
except:
    my_var = None

但是说实话,这可能并不能完全解决你想要做的事情...我们需要更多的上下文来更全面地回答。

我刚刚添加了一个澄清 - some_var实际上是一个字典,我想确保其中存在该键,否则使用None。 - 9-bits

0

对于一个新的字典:

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)

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