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