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

然而,如果你搜索一个不存在的键,Python会引发一个KeyError异常。我知道我可以检查钥匙,但我在寻找更明确的东西。如果键不存在,是否有一种方法只返回None ?


使用dict.get

如果key在字典中,则返回key的值,否则为默认值。如果没有给出default,则默认为None,因此该方法永远不会引发KeyError。


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

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

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


你可以使用dict.get()

value = d.get(key)

如果key不在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

我通常在这种情况下使用defaultdict。您提供一个不接受参数的工厂方法,并在看到新键时创建一个值。当您希望在新键上返回一个空列表之类的内容时,它会更有用(请参阅示例)。

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>

这被认为是处理这种情况的一种非常“python”的方法。


如果你可以使用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 vs python3的功能吓了一跳。我将根据我最终为python3所做的工作来回答这个问题。我的目标很简单:检查字典格式的json响应是否出错。我的字典叫“令牌”,我要找的键是“错误”。我正在寻找键“错误”,如果它不在那里设置为None的值,然后检查是值为None,如果是这样,继续我的代码。如果我确实有键“错误”,else语句将处理。

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

给那些使用字典的人。获取嵌套字典的技术,而不是显式地检查字典的每一层,或扩展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-except块

try:
    value = dict['keyname']

except IndexError:
    value = None

d1 ={“一”:1、“两个”:2,“三”:3} 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