【问题标题】:how to use python "get()" for keys deeper than first level of dictionary keys?如何使用python“get()”获取比第一级字典键更深的键?
【发布时间】:2016-05-23 03:19:41
【问题描述】:

我有一个超过 2 个级别的 Python 字典,如下所示:

dict = {'keyA_1':'valueA_1', 'keyB_1': {'keyB_2':{'keyB_3':'valueB_3'}}}

我希望提取'keyA_1''keyB_3' 的值。但是,在我的代码中,我不想使用一堆 try/except KeyError 进行错误检查,因为我有数千个键值对。相反,如果键不存在,则简单地返回 None。我发现的一种解决方案是使用 python get()。这很好用,但仅适用于第一级键值对。

例如,如果'keyA_1' 不存在

dict.get('keyA_1')

会返回None

但是如果'keyB_3'不存在

dict.get('keyB_1').get('keyB_2').get('keyB_3')

将返回 AttributeError: 'NoneType' object has no attribute 'get' 而不是 None

如果所有父键及其键都存在则返回值 'keyB_3' 简单地做同样的事情,否则返回 None。有什么建议吗?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    接受的答案有效,但内联代码太多。这是一个易于使用的版本:

    # Usage: dot_get(mydict, 'some.deeply.nested.value', 'my default')
    def dot_get(_dict, path, default=None):
      for key in path.split('.'):
        try:
          _dict = _dict[key]
        except KeyError:
          return default
      return _dict
    

    最简单的使用: retrieved_value = dot_get('some.deeply.nested.value')

    【讨论】:

      【解决方案2】:

      您可以将默认值作为第二个参数传递给dict.get(),如下所示:

      dict.get('keyB_1', {}).get('keyB_2', {}).get('keyB_3')
      

      【讨论】:

        猜你喜欢
        • 2014-06-21
        • 2018-01-24
        • 2013-03-25
        • 1970-01-01
        • 2022-10-16
        • 2021-10-16
        • 2023-03-10
        • 1970-01-01
        • 2021-11-01
        相关资源
        最近更新 更多