我需要一种方法来获取字典值(如果它的键存在),或者简单地返回None
,如果它不存在。
但是,KeyError
如果您搜索不存在的键,Python会引发异常。我知道我可以检查密钥,但是我正在寻找更明确的密钥。None
如果密钥不存在,是否有办法返回?
我需要一种方法来获取字典值(如果它的键存在),或者简单地返回None
,如果它不存在。
但是,KeyError
如果您搜索不存在的键,Python会引发异常。我知道我可以检查密钥,但是我正在寻找更明确的密钥。None
如果密钥不存在,是否有办法返回?
Answers:
您可以使用 dict.get()
value = d.get(key)
None
如果将返回key is not in d
。您还可以提供将返回的其他默认值,而不是None
:
value = d.get(key, "empty")
None
如果键None
在dict中显式映射到默认变体的第二个变体仍将返回。如果这不是您想要的,可以使用d.get(key) or "empty"
。
[]
,""
,False
,0.0
或事实上None
),那么你的解决方案将始终返回0
。如果希望将None
s作为值,则必须if key in d:
显式地进行检查。
"empty"
如果key
不是有效的键,则返回d
。它与key
映射到的值无关。
如果您想要一个更透明的解决方案,则可以继承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
是,每当请求一个尚不存在的元素时,它将增加。这并不总是可取的。
foo['bar']['test']['sss']
要返回None
而不是例外,经过一段深度后,它开始给予TypeError
而不是KeyError
NoneDicts
。如果这将在KeyError
最里面的对象中发生,这将有所帮助。否则问题是,一旦返回None
对象,您将无法再订阅它。一个丑陋的破解方法是返回另一个测试类似的对象None
。但是请注意,这可能会导致可怕的错误。
return dict.get(self, key)
为return super().get(key)
吗?然后,例如,如果我决定使用OrderedDict而不是dict,则不必担心更改多行代码。
我通常在这种情况下使用defaultdict。您提供一个不带任何参数的工厂方法,并在看到新键时创建一个值。当您想在新键上返回空列表之类的功能时,它会更有用(请参见示例)。
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
defaultdict
是,每次请求不存在的元素时,它将保持增长。
一线解决方案是:
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
方法的原因。
.get(key)
的不是[key]