关于python:如果Dictionary键不可用,则返回None

Return None if Dictionary key is not available

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

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


您可以使用get()

1
value = d.get(key)

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

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


再也不奇怪了。它内置于语言中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    >>> 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


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

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

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


如果需要更透明的解决方案,可以将dict子类化,以获得此行为:

1
2
3
4
5
6
7
8
9
10
11
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


对于这种情况,我通常使用默认的dict。您提供了一个不带参数的工厂方法,并在它看到新键时创建一个值。当您想要返回一些新键上的空列表(参见示例)时,它更有用。

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


您可以使用dict对象的get()方法,正如其他人已经建议的那样。或者,根据您所做的具体工作,您可以使用这样的try/except套件:

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

这被认为是处理此案的一种非常"Python式"的方法。


一线解决方案是:

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

当尝试将字典值添加到新列表并希望提供默认值时,此选项非常有用:

如。

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


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

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

1
2
3
4
5
6
7
8
9
10
d = {}
if 'keyname' in d:

    # d['keyname'] exists
    pass

else:

    # d['keyname'] does not exist
    pass


您可以通过子类化dict来重写__missing__(self, key),并返回none。

1
2
3
class MyDict(dict):
    def __missing__(self, key):
        return None


如果您可以使用False,那么还有hasattr内置功能:

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