# 见 代码 ,代码粘贴上不带格式,按照图片用tab键调整一下,图片是核心部分
simple_dict?=?{
'Large_dict'?:?{'middle_dict1'?:?{'small_dict1'?:?1?,
'small_dict2'?:?2},
'middle_dict2'?:?{'small_dict3'?:?3?,
'small_dict4'?:?4,
'small_dict5':{'small_dict10'?:?1?,
'small_dict22'?:?3},
},
}
}
#?需求分析:?从嵌套字典中,找到值为3的路径关系
#?简化模型:从value为3的值?递归向上层的?key?,递归过程保存当前已经递归的路径和当前层
#?1.找到字典一***有多少层:
count?=?0
path?=?''#?设置路径的全局变量
result?=?[]#?记录结论
def?get_count(dict_test):
global?count#?声明每次递归均是改变全局变量
global?path#?拼接档期啊你的路径
global?result#?记录结果
for?i?in?dict_test:
if?type(dict_test[i]).__name__?=='dict'?:
#?如果是字典,则继续向下展开,即执行递归:
if?count?==?0:?#?增加判断?消除第一个?<-?出现,逻辑问题
path?=?path+?i
else:
path?=?path?+?'<-'?+?i
count?+=?1#?记录层数
get_count(dict_test[i])
else:
try:
#?如果不是字典?则是键值对,查询value值是不是3,当前i包含两个内容,一个是key,一个是value
if?dict_test[i]?==?3:
#?找到了value?=3?的值
result.append(f"路径是:?%s,在第%d层"?%?(path?+?'<-'?+?i,?count))
except?Exception?asresult:#?虽然字典限定了写法,为了增加健壮性?此位置使用try指令,避免类型错误
print(result)
continue
if?__name__?==?'__main__':
get_count(simple_dict)#?执行递归函数
[print(str(i?+?1)?+?':'?+?j)?for?i,?j?in?enumerate(result)]#?打印结果
'''
结果:?
1:路径是:?Large_dict<-middle_dict1<-middle_dict2<-small_dict3,在第3层
2:路径是:?Large_dict<-middle_dict1<-middle_dict2<-small_dict5<-small_dict22,在第4层
'''