如何对比第一级字典键更深的键使用python“get()”?

时间:2016-05-23 03:19:41

标签: python dictionary

我有一个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。有什么建议吗?

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:0)

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

# 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')