目前我使用以下方法,假设字典
data[a][b][c]
Run Code Online (Sandbox Code Playgroud)
我用:
if "a" in data and "b" in data["a"] and "c" in data["a"]["b"]:
...
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法?
我通常会使用该模式
foo = data.get("a",{}).get("b",{}).get("c",False)
if foo:
...
Run Code Online (Sandbox Code Playgroud)
这要求嵌套始终具有相同的深度,并且 data["a"]["b"]["c"] 不是“假”。
您可以将其包装在try/except块中
try:
x = data[a][b][c]
...do stuff in your "if" clause
except KeyError:
...do stuff in your "else" clause
Run Code Online (Sandbox Code Playgroud)
有两个解决方案:
您可以使用 a defaultdict,并用另一个 来实例化内部级别defaultdict。然后,如果密钥丢失,它将返回一个空字典而不会抛出错误:
from collections import defaultdict
>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['a']['b']
{}
Run Code Online (Sandbox Code Playgroud)
如果您需要更多级别,则只需链接多个lambda.
部分参考:Python 中“collection.defaultdict”的多个级别
try另一种方法是用/块包围字典访问except并通过异常管理丢失的键KeyError(停止程序,返回默认值等)
try:
x = data[a][b][c]
# same code of your if statement
except KeyError:
# stuff you do in your else
Run Code Online (Sandbox Code Playgroud)