我需要一种方法来获取字典值,如果它的键存在,或者只是返回None
,如果不存在的话。
但是,如果搜索不存在的密钥,Python会引发KeyError
异常。我知道我可以检查密钥,但我正在寻找更明确的东西。如果密钥不存在,有没有办法只返回None
?
答案 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