目前我使用以下方法,假设字典
data[a][b][c]
我用:
if "a" in data and "b" in data["a"] and "c" in data["a"]["b"]:
...
还有更好的方法吗?
答案 0 :(得分:7)
您可以将其包装在try / except块
中try:
x = data[a][b][c]
...do stuff in your "if" clause
except KeyError:
...do stuff in your "else" clause
答案 1 :(得分:4)
我通常会使用模式
foo = data.get("a",{}).get("b",{}).get("c",False)
if foo:
...
这要求嵌套始终具有相同的深度,并且数据[“a”] [“b”] [“c”]不是“假”。
答案 2 :(得分:1)
有两个解决方案:
您可以使用defaultdict
,并将内部级别与另一个defaultdict
解释。然后,如果密钥丢失,它将返回一个空的字典而不会抛出错误:
from collections import defaultdict
>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['a']['b']
{}
如果您需要更多级别,则只需链接多个lambda
。
部分参考:Multiple levels of 'collection.defaultdict' in Python
另一种方法是使用try
/ except
阻止dict访问,并通过KeyError
异常管理缺失的密钥(停止程序,返回默认值等)
try:
x = data[a][b][c]
# same code of your if statement
except KeyError:
# stuff you do in your else
答案 3 :(得分:1)
如果你需要经常进行多级查找,这个辅助方法会很有用:
def multi_get(dict_obj, *attrs, default=None):
result = dict_obj
for attr in attrs:
if attr not in result:
return default
result = result[attr]
return result
要使用它,只需将其命名为:
x = multi_get(data, 'a', 'b', 'c', default=False)