检查Python多级字典的最佳方法

Rya*_*yan 6 python

目前我使用以下方法,假设字典

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)

有没有更好的方法?

col*_*oll 7

我通常会使用该模式

foo = data.get("a",{}).get("b",{}).get("c",False)
if foo:
...
Run Code Online (Sandbox Code Playgroud)

这要求嵌套始终具有相同的深度,并且 data["a"]["b"]["c"] 不是“假”。


tde*_*ney 7

您可以将其包装在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)


Max*_*ant 1

有两个解决方案:

使用defaultdict返回默认值

您可以使用 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 处理丢失的键

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)