如果字典键不可用,则返回默认值

我需要一种方法来获取字典值,如果它的键存在,或者简单地返回None,如果它不存在。

但是,如果您搜索不存在的密钥,Python会引发KeyError异常。我知道我可以检查密钥,但我正在寻找更明确的东西。如果密钥不存在,有没有办法返回None

560666 次浏览

使用dict.get

如果键在字典中,则返回键的值,否则为默认值。如果未给出默认值,则默认为无,因此此方法永远不会引发KeyError。

您应该使用dict类中的get()方法

d = {}
r = d.get('missing_key', None)

这将导致r == None。如果在字典中找不到键,get函数将返回第二个参数。

您可以使用dict.get()

value = d.get(key)

如果key is not in d,将返回None。您还可以提供将返回而不是None的不同默认值:

value = d.get(key, "empty")

如果你想要一个更透明的解决方案,你可以子类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

正如上面所说,您可以使用get()。

但要检查密钥,您还可以执行以下操作:

d = {}
if 'keyname' in d:


# d['keyname'] exists
pass


else:


# d['keyname'] does not exist
pass

我通常使用默认来处理这种情况。您提供了一个工厂方法,该方法不接受参数并在看到新键时创建一个值。当你想在新键(见示例)上返回类似空列表的东西时,它更有用。

from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key']  # prints 'None'

别再想了。它已经内置在语言中了。

>>> help(dict)


Help on class dict in module builtins:


class dict(object)
|  dict() -> new empty dictionary
|  dict(mapping) -> new dictionary initialized from a mapping object's
|      (key, value) pairs
...
|
|  get(...)
|      D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.
|
...

正如其他人已经建议的那样,你可以使用dict对象的get()方法。或者,根据你正在做的事情,你可能可以像这样使用try/except套件:

try:
<to do something with d[key]>
except KeyError:
<deal with it not being there>

这被认为是一种非常“Pythonic”的处理方式。

如果你可以用False做到这一点,那么,还有hasattr的内置功能:

e=dict()
hasattr(e, 'message'):
>>> False

一条线的解决方案是:

item['key'] if 'key' in item else None

这在尝试将字典值添加到新列表并希望提供默认值时很有用:

eg.

row = [item['key'] if 'key' in item else 'default_value']

我被python2和python3的可能性吓了一跳。我将根据我最终为python3做的事情来回答它。我的目标很简单:检查字典格式的json响应是否给出了错误。我的字典称为“令牌”,我正在寻找的键是“错误”。我正在寻找键“错误”,如果它不在那里,将其设置为无,然后检查值是否为无,如果是这样,请继续我的代码。如果我确实有键“错误”,则会使用其他语句来处理。

if ((token.get('error', None)) is None):
do something

对于那些对嵌套字典使用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

您可以使用try-除了块

try:
value = dict['keyname']


except IndexError:
value = None
  1. d 1={“一”: 1,“二”: 2,“三”: 3}

  2. d1.get(“四”)

如果您将运行此代码,则不会有“Keyerror”,这意味着您可以使用“dict.get()”来避免错误并执行代码

如果您有一个相当于缓存的更复杂的需求,这个类可能会派上用场:

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