到达嵌套字典的深度很深(可能不存在) - python

我有一个可以返回字典的API。该词典的一部分本身就是另一本词典。在该内部词典中,有些键可能不存在,也可能存在。这些键可以引用另一本词典。

举个例子,说我有以下字典:

dict1 = {'a': {'b': {'c':{'d':3}}}}
dict2 = {'a': {'b': {''f': 2}}}

我想编写一个可以在字典中传递的函数,以及一个将导致我进入3中的dict12中的dict2的键的列表。但是,bcdict1中可能不存在,而bfdict2中可能不存在。

我想要一个可以这样调用的函数:

get_value(dict1, ['a', 'b', 'c'])

并返回3,或者如果找不到键,则返回默认值0。

我知道我可以这样使用:

val = dict1.get('a', {}).get('b', {}).get('c', 0)

但这对我来说似乎很罗word。

我还可以拼凑字典(请参见https://stackoverflow.com/a/6043835/1758023),但这可能会有点费力,因为我的字典实际上很大,并且在某些键中嵌套了大约5个级别。而且,我只需要从字典中得到两点即可。

现在,我在SO问题中使用了flattenDict函数,但这对我的情况来说似乎有些过大了。

python大神给出的解决方案

您可以使用递归函数:

def get_value(mydict, keys):
    if not keys:
        return mydict
    if keys[0] not in mydict:
        return 0
    return get_value(mydict[keys[0]], keys[1:])

如果键不仅可以丢失,而且可以是其他非字典类型,则可以这样处理:

def get_value(mydict, keys):
    if not keys:
        return mydict
    key = keys[0]
    try:
        newdict = mydict[key]
    except (TypeError, KeyError):
        return 0
    return get_value(newdict, keys[1:])