如果键存在,我需要一种获取字典值的方法,否则只返回None
。
然而,如果搜索不存在的键,Python会引发一个KeyError
异常。我知道我可以检查键是否存在,但我正在寻找更明确的方法。是否有一种方式,如果键不存在,就只返回None
?
如果键存在,我需要一种获取字典值的方法,否则只返回None
。
然而,如果搜索不存在的键,Python会引发一个KeyError
异常。我知道我可以检查键是否存在,但我正在寻找更明确的方法。是否有一种方式,如果键不存在,就只返回None
?
你可以使用dict.get()
方法。
value = d.get(key)
如果 key
不在字典 d
中,将返回None
。您还可以提供一个不同的默认值,代替None
:
value = d.get(key, "empty")
None
,则使用默认回退的第二个变体仍将返回None
。 如果这不是您想要的结果,您可以使用类似于d.get(key) or "empty"
的方法。 - cib[]
,""
,False
,0.0
或确切地说是None
),那么你的解决方案将始终返回0
。如果你期望值为None
,则需要显式执行if key in d:
检查。 - Tim Pietzckerd.get(key, "empty")
,它没有这个问题),而不是 or
变体。 - Tim Pietzcker不必再猜测,这已经内置在语言中了。
>>> help(dict)
在模块builtins中的class dict(object)上提供帮助文档:
class dict(object) | dict() -> 新空字典 | dict(mapping) -> 新字典,从映射对象的(key, value)对进行初始化 ... | | get(...) | D.get(k[,d]) -> 如果k在D中,则返回D[k],否则返回d。默认为None。 | ...
get()
方法。d = {}
r = d.get('missing_key', None)
这将导致r == None
。 如果字典中没有找到键,则get函数将返回第二个参数。
None
,它是默认值。 - Björn Pollex如果你想要一个更透明的解决方案,你可以子类化dict
来得到这种行为:
class NoneDict(dict):
def __getitem__(self, key):
return dict.get(self, key)
>>> foo = NoneDict([(1,"asdf"), (2,"qwerty")])
>>> foo[1]
'asdf'
>>> foo[2]
'qwerty'
>>> foo[3] is None
True
defaultdict
的问题在于每次请求一个尚未存在的元素时它都会增长。这并不总是理想的。 - Björn Pollexfoo['bar']['test']['sss']
返回 None
而不是异常。在一定深度后,它开始给出 TypeError
而不是 KeyError
。 - nehemreturn dict.get(self, key)
改成 return super().get(key)
可以吗?这样如果我决定使用 OrderedDict 而不是 dict,就不必担心需要改动多行代码了。 - Wood我通常在这种情况下使用defaultdict。您提供一个不带参数的工厂方法,当它遇到新键时创建一个值。在想要在新键上返回空列表时,它更有用(请参阅示例)。
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
defaultdict
的问题在于每次请求不存在的元素时它都会不断增长。 - Björn Pollex一行解决方案如下:
item['key'] if 'key' in item else None
当尝试将字典值添加到新列表并希望提供默认值时,这非常有用:
例如:
row = [item['key'] if 'key' in item else 'default_value']
如其他人所说,您可以使用get()方法。
但是,要检查一个键是否存在,您也可以这样做:
d = {}
if 'keyname' in d:
# d['keyname'] exists
pass
else:
# d['keyname'] does not exist
pass
你可以使用字典对象的get()
方法,就像其他人已经建议的那样。或者,根据你实际需要做什么,你也可以像这样使用try/except
语句块:
try:
<to do something with d[key]>
except KeyError:
<deal with it not being there>
这被认为是一种非常“Pythonic”的处理方式。
对于那些使用 dict.get
技术来处理嵌套字典的人,不需要显式地检查字典的每个级别或扩展 dict
类,可以将默认返回值设置为除最外层之外的空字典。下面是一个例子:
my_dict = {'level_1': {
'level_2': {
'level_3': 'more_data'
}
}
}
result = my_dict.get('level_1', {}).get('level_2', {}).get('level_3')
# result -> 'more_data'
none_result = my_dict.get('level_1', {}).get('what_level', {}).get('level_3')
# none_result -> None
警告:请注意,此技术仅适用于预期的键值为字典的情况。如果字典中存在 what_level
键,但其值为字符串或整数等,则会引发 AttributeError
。
.get(key)
代替[key]
。 - Gabe