【问题标题】:Best way to check Python multi-level dictionary检查Python多级字典的最佳方法
【发布时间】:2014-01-14 05:28:07
【问题描述】:

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

data[a][b][c]

我用:

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

有没有更好的办法?

【问题讨论】:

  • “按原样”投票:)

标签: python


【解决方案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

【讨论】:

    【解决方案2】:

    我通常会使用该模式

    foo = data.get("a",{}).get("b",{}).get("c",False)
    if foo:
    ...
    

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

    【讨论】:

      【解决方案3】:

      你可以把它包装在一个 try/except 块中

      try:
          x = data[a][b][c]
          ...do stuff in your "if" clause
      except KeyError:
          ...do stuff in your "else" clause
      

      【讨论】:

        【解决方案4】:

        如果您需要经常进行这种多级查找,这个辅助方法会很有用:

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-26
          • 1970-01-01
          • 2011-05-09
          • 2011-01-24
          • 2015-07-03
          • 1970-01-01
          • 2011-06-25
          • 1970-01-01
          相关资源
          最近更新 更多