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

时间:2011-05-25 20:49:52

标签: python

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

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

13 个答案:

答案 0 :(得分:652)

您可以使用get()

value = d.get(key)
如果None

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

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

答案 1 :(得分:59)

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

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

答案 2 :(得分:23)

使用dict.get

答案 3 :(得分:18)

您应该使用get()

中的dict方法
d = {}
r = d.get( 'missing_key', None )

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

答案 4 :(得分: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

答案 5 :(得分:10)

我经常在这种情况下使用defaultdict。您提供了一个不带参数的工厂方法,并在看到新键时创建一个值。当您想要在新密钥(see the examples)上返回类似空列表的内容时,它会更有用。

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

答案 6 :(得分:6)

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

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

这被认为是处理案件的非常“Pythonic”方法。

答案 7 :(得分:4)

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

但要检查密钥,您也可以这样做:

d = {}
if 'keyname' in d:

    # d['keyname'] exists
    pass

else:

    # d['keyname'] does not exist
    pass

答案 8 :(得分:4)

一线解决方案是:

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

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

例如。

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

答案 9 :(得分:1)

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

答案 10 :(得分:0)

我被python2 vs python3的可能吓了一跳。我将根据最终对python3所做的回答。我的目标很简单:检查字典格式的json响应是否给出错误。我的字典称为“令牌”,而我正在寻找的密钥是“错误”。我正在寻找键“错误”,如果不存在,则将其设置为“无”,然后检查其值为“无”,如果是,请继续执行我的代码。如果我确实拥有键“错误”,则将执行else语句。

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

答案 11 :(得分:-1)

如果您可以使用False执行此操作,那么还有hasattr内置功能:

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

答案 12 :(得分:-2)

您可以通过继承dict来覆盖__missing__(self, key)并返回None。

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