我有一个可以返回字典的API。该词典的一部分本身就是另一本词典。在该内部词典中,有些键可能不存在,也可能存在。这些键可以引用另一本词典。
举个例子,说我有以下字典:
dict1 = {'a': {'b': {'c':{'d':3}}}}
dict2 = {'a': {'b': {''f': 2}}}
我想编写一个可以在字典中传递的函数,以及一个将导致我进入3
中的dict1
和2
中的dict2
的键的列表。但是,b
和c
在dict1
中可能不存在,而b
和f
在dict2
中可能不存在。
我想要一个可以这样调用的函数:
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:])