如果字典键不可用,则返回None

Spy*_*ros 433 python dictionary key nonetype

如果它的键存在,我需要一种获取字典值的方法,或者None如果不存在则需要返回.

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

Tim*_*ker 723

您可以使用 dict.get()

value = d.get(key)
Run Code Online (Sandbox Code Playgroud)

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

value = d.get(key, "empty")
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果在dict中将键显式映射到"None",则具有默认回退的第二个变量仍将返回"None".如果这不是你想要的,你可以使用像`d.get(key)或"empty"这样的东西. (36认同)
  • @cib:好点,但是解决方案有类似的问题 - 如果键被映射到任何"falsy"值(比如`[]`,````,`False`,`0.0`或者确实`None`) ,那么你的解决方案总会返回"0".如果你期望`None`s作为值,你必须明确地执行`if key in d:`check. (13认同)

Joh*_*ooy 62

不要再想了.它内置于语言中.

    >>> 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.
     |  
    ...


dus*_*der 19

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

d = {}
r = d.get( 'missing_key', None )
Run Code Online (Sandbox Code Playgroud)

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

  • 您不必明确传递`None`.这是默认值. (18认同)

Bjö*_*lex 17

如果您想要更透明的解决方案,可以继承子类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
Run Code Online (Sandbox Code Playgroud)

  • @marineau:正如我在对另一个答案的评论中提到的那样,`defaultdict`的问题是,每次请求尚未存在的元素时它都会增长.这并不总是令人满意的. (2认同)
  • @BjörnPollex 这是迄今为止最优雅的一个,关于如何扩展它以支持任何深度的任何线索?我的意思是让 `foo['bar']['test']['sss']` 返回 `None` 而不是异常,在一个深度之后它开始给出 `TypeError` 而不是 `KeyError` (2认同)

job*_*job 11

我通常在这种情况下使用defaultdict.您提供了一个不带参数的工厂方法,并在看到新键时创建一个值.当你想在新键上返回类似空列表的内容时,它会更有用(参见示例).

from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key']  # prints 'None'
Run Code Online (Sandbox Code Playgroud)

  • `defaultdict`的问题在于每次请求不存在的元素时它都会继续增长. (18认同)

mar*_*eau 8

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

try:
   <to do something with d[key]>
except KeyError:
   <deal with it not being there>
Run Code Online (Sandbox Code Playgroud)

这被认为是处理案件的非常"Pythonic"方法.


Mar*_*k P 6

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

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

d = {}
if 'keyname' in d:

    # d['keyname'] exists
    pass

else:

    # d['keyname'] does not exist
    pass
Run Code Online (Sandbox Code Playgroud)

  • 这种方法通常需要键在那里时被查找两次,这可能是`get` 方法的原因。 (4认同)

ima*_*123 6

一种解决方案是:

item['key'] if 'key' in item else None
Run Code Online (Sandbox Code Playgroud)

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

例如。

row = [item['key'] if 'key' in item else 'default_value']
Run Code Online (Sandbox Code Playgroud)