如果它的键存在,我需要一种方法来获取字典值,或者如果它不存在则简单地返回 None
。
但是,如果您搜索不存在的键,Python 会引发 KeyError
异常。我知道我可以检查密钥,但我正在寻找更明确的东西。如果密钥不存在,有没有办法只返回 None
?
.get(key)
而不是 [key]
您可以使用 dict.get()
value = d.get(key)
如果 key is not in d
将返回 None
。您还可以提供将返回的不同默认值而不是 None
:
value = d.get(key, "empty")
不用怀疑了。它内置在语言中。
>>> 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()
方法
d = {}
r = d.get('missing_key', None)
这将导致 r == None
。如果在字典中找不到键,get 函数将返回第二个参数。
None
。这是默认设置。
如果您想要一个更透明的解决方案,您可以继承 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
defaultdict
的问题在于,每次请求尚未包含的元素时,它都会增长。这并不总是可取的。
foo['bar']['test']['sss']
返回 None
而不是异常,在一个深度之后它开始给出 TypeError
而不是 KeyError
NoneDicts
的整个结构。如果 KeyError
发生在最里面的对象中,这将有所帮助。否则问题是,一旦您返回 None
对象,您将无法再订阅它。一个丑陋的 hack 是返回另一个像 None
测试的对象。但是请注意,这可能会导致可怕的错误。
return dict.get(self, key)
更改为 return super().get(key)
吗?然后,如果我决定使用 OrderedDict 而不是 dict,例如,我不必担心更改多行代码。
对于这种情况,我通常使用 defaultdict。您提供一个不带参数的工厂方法,并在看到新键时创建一个值。当您想在新键 (see the examples) 上返回空列表之类的内容时,它会更有用。
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
defaultdict
的问题是每次请求不存在的元素时它都会不断增长。
正如其他人已经建议的那样,您可以使用 dict
对象的 get()
方法。或者,根据您正在做什么,您也许可以使用这样的 try/except
套件:
try:
<to do something with d[key]>
except KeyError:
<deal with it not being there>
这被认为是处理此案的一种非常“Pythonic”的方法。
单线解决方案是:
item['key'] if 'key' in item else None
这在尝试将字典值添加到新列表并希望提供默认值时很有用:
例如。
row = [item['key'] if 'key' in item else 'default_value']
正如上面其他人所说,您可以使用 get()。
但是要检查密钥,您还可以执行以下操作:
d = {}
if 'keyname' in d:
# d['keyname'] exists
pass
else:
# d['keyname'] does not exist
pass
get
方法的原因。
对于那些对嵌套字典使用 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
。
我对 python2 与 python3 中可能发生的事情感到震惊。我将根据我最终为 python3 所做的事情来回答它。我的目标很简单:检查字典格式的 json 响应是否出错。我的字典被称为“令牌”,我正在寻找的密钥是“错误”。我正在寻找关键的“错误”,如果它不存在将其设置为 None,那么检查该值是否为 None,如果是,请继续我的代码。如果我确实有键“错误”,则 else 语句将处理。
if ((token.get('error', None)) is None):
do something
您可以使用 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
不定期副业成功案例分享
None
,则具有默认回退的第二个变体仍将返回None
。如果这不是您想要的,您可以使用d.get(key) or "empty"
之类的东西。[]
、""
、False
、0.0
或确实None
),那么您的解决方案将始终返回0
。如果您期望None
作为值,则必须明确执行if key in d:
检查。key
不是d
中的有效键,则返回"empty"
。它与映射到的值key
无关。