如何使用Python的"get()"方法获取字典嵌套键值对中深度大于一级的键值对?

7

我有一个Python字典,有超过2个层级,类似于这样:

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

当父密钥或其密钥不存在时,应返回None而不是AttributeError: 'NoneType' object has no attribute 'get'

如果所有父键和它的键存在,则可以简单地对'keyB_3'执行相同的操作,返回该值,否则返回None。有什么建议吗?

2个回答

18
你可以将默认值作为第二个参数传递给dict.get(),像这样:
dict.get('keyB_1', {}).get('keyB_2', {}).get('keyB_3')

4

那个被接受的回答虽然可行,但是代码太过冗长。这里提供一种更加简单易用的版本:

# 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('一些.深度.嵌套.值')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接