如果字典键不可用,则返回默认值
- 2024-12-23 08:43:00
- admin 原创
- 90
问题描述:
如果字典中的键存在,我需要一种方法来获取该字典的值,None
如果不存在,则简单地返回。
但是,如果您搜索不存在的键,Python 会引发异常。我知道我可以检查键,但我正在寻找更明确的东西。如果键不存在,KeyError
有没有办法直接返回?None
另请参阅: 为什么使用 dict.get(key) 而不是 dict[key]?
解决方案 1:
您可以使用dict.get()
value = d.get(key)
None
如果 则返回key is not in d
。您还可以提供将返回的不同默认值None
(除非字典实际上包含None
此键的值):
value = d.get(key, "empty")
解决方案 2:
不用再奇怪了。它已经内置于语言中了。
>>> 帮助(字典)
模块内置函数中类字典的帮助:
字典类(对象)
| dict() -> 新的空字典
| dict(mapping) -> 从映射对象初始化的新字典
| (键,值) 对
...
|
| 获取(...)
| D.get(k[,d]) -> D[k] 如果 k 在 D 中,否则 d。d 默认为 None。
|
...
解决方案 3:
您应该使用类get()
中的方法dict
d = {}
r = d.get('missing_key', None)
这将导致r == None
。如果在字典中找不到键,则 get 函数返回第二个参数。
解决方案 4:
使用dict.get
如果 key 在字典中,则返回 key 的值,否则返回默认值。如果没有给出默认值,则默认为 None,因此此方法永远不会引发 KeyError。
解决方案 5:
对于这种情况,我通常使用defaultdict 。您提供一个工厂方法,该方法不接受任何参数,并在看到新键时创建一个值。当您想在新键上返回空列表之类的内容时,它更有用(参见示例)。
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
解决方案 6:
如果您想要一个更加透明的解决方案,您可以通过子类化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
解决方案 7:
一行解决方案是:
item['key'] if 'key' in item else None
当尝试将字典值添加到新列表并想要提供默认值时,这很有用:
例如。
row = [item['key'] if 'key' in item else 'default_value']
解决方案 8:
正如上面其他人所说,您可以使用 get()。
但要检查密钥,您还可以执行以下操作:
d = {}
if 'keyname' in d:
# d['keyname'] exists
pass
else:
# d['keyname'] does not exist
pass
解决方案 9:
您可以使用dict
对象的get()
方法,正如其他人已经建议的那样。或者,根据您正在做的事情,您可能能够使用try/except
如下套件:
try:
<to do something with d[key]>
except KeyError:
<deal with it not being there>
这被认为是一种非常“Pythonic”的处理案件的方法。
解决方案 10:
正如其他地方提到的,一个可能的问题dct.get(key, default)
是,如果key in dct
但是dct[key] is None
,你得到的None
不是你的default
:
>>> dct = dict(foo=123, baz=None)
>>> dct.get("foo", 0)
123
>>> str(dct.get("bar", 0)
0
>>> dct.get("baz", 0)
>>> # where'd the value go?
从 Python 3.8 开始,使用“海象运算符”创建赋值表达式,你可以像这样处理:
>>> value if (value := dct.get("baz")) is not None else 0
0
解决方案 11:
对于那些使用嵌套字典技术的人来说,你可以将默认返回值设置为除最外层之外的空字典,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
。
解决方案 12:
我对 python2 与 python3 的差异感到吃惊。我将根据我最终为 python3 所做的工作来回答这个问题。我的目标很简单:检查字典格式的 json 响应是否出现错误。我的字典名为“token”,我正在寻找的键是“error”。我正在寻找键“error”,如果它不在那里,则将其设置为 None 的值,然后检查该值是否为 None,如果是,则继续执行我的代码。如果我确实有键“error”,则 else 语句将进行处理。
if ((token.get('error', None)) is None):
do something
解决方案 13:
如果您有更复杂的要求(相当于缓存),则此类可能会派上用场:
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
解决方案 14:
d1={"一":1,"二":2,"三":3}
d1.get("四")
如果您运行此代码,则不会出现“Keyerror”,这意味着您可以使用“dict.get()”来避免错误并执行您的代码
解决方案 15:
您可以使用 try-except 块
try:
value = dict['keyname']
except IndexError:
value = None
解决方案 16:
如果您可以使用 来完成此操作False
,那么还有hasattr内置函数:
e=dict()
hasattr(e, 'message'):
>>> False
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)