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

时间:2013-12-26 14:57:00

标签: python

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

data[a][b][c]

我用:

if "a" in data and "b" in data["a"] and "c" in data["a"]["b"]:
  ...

还有更好的方法吗?

4 个答案:

答案 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,并将内部级别与另一个defaultdict解释。然后,如果密钥丢失,它将返回一个空的字典而不会抛出错误:

from collections import defaultdict

>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['a']['b']
{}

如果您需要更多级别,则只需链接多个lambda

部分参考:Multiple levels of 'collection.defaultdict' in Python

使用try / except

处理缺失的密钥

另一种方法是使用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)