我需要一种方法来获得字典值,如果它的键存在,或简单地返回None,如果它不存在。
然而,如果你搜索一个不存在的键,Python会引发一个KeyError异常。我知道我可以检查钥匙,但我在寻找更明确的东西。如果键不存在,是否有一种方法只返回None ?
我需要一种方法来获得字典值,如果它的键存在,或简单地返回None,如果它不存在。
然而,如果你搜索一个不存在的键,Python会引发一个KeyError异常。我知道我可以检查钥匙,但我在寻找更明确的东西。如果键不存在,是否有一种方法只返回None ?
当前回答
使用dict.get
如果key在字典中,则返回key的值,否则为默认值。如果没有给出default,则默认为None,因此该方法永远不会引发KeyError。
其他回答
您可以使用try-except块
try:
value = dict['keyname']
except IndexError:
value = None
如果你有一个更复杂的需求,等价于缓存,这个类可能会派上用场:
class Cache(dict):
""" Provide a dictionary based cache
Pass a function to the constructor that accepts a key and returns
a value. This function will be called exactly once for any key
required of the cache.
"""
def __init__(self, fn):
super()
self._fn = fn
def __getitem__(self, key):
try:
return super().__getitem__(key)
except KeyError:
value = self[key] = self._fn(key)
return value
构造函数接受一个用键调用的函数,该函数应返回字典的值。然后存储这个值,并在下次从字典中检索。像这样使用它……
def get_from_database(name):
# Do expensive thing to retrieve the value from somewhere
return value
answer = Cache(get_from_database)
x = answer(42) # Gets the value from the database
x = answer(42) # Gets the value directly from the dictionary
一个简单的解决方案是:
item['key'] if 'key' in item else None
这在尝试将字典值添加到新列表并希望提供默认值时非常有用:
eg.
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
如果你想要一个更透明的解决方案,你可以子类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