1 #获取字典中的objkey对应的值,适用于字典嵌套

2 #targetDict:要查找的字典;serchKey:要查找的目标key

3 #ret:递归过程中,向外部(上层)传送 return值。被查找目标在第几层,则返回几次ret

4 #default:查不到符合的serchKey,就返回默认值None

5 def dict_getValue(targetDict,serchKey,default=None):6 for k,v intargetDict.items():7 if k ==serchKey:8 returnv9 elifisinstance(v,dict):10 ret =dict_getValue(v,serchKey,default)11 if ret is not default: #ret与default=None不等,表示找到serchKey,则ret会作为返回值向上层返回。

12 returnret13 return default

View Code

测试数据,拼接在上面的代码里即可

1 if __name__ == ‘__main__‘:2 targetDict ={"H": {"Ver": ["aaaa","bbbb"],"ACID": {‘kkk‘:"aaaaa"},"CInf": [100,2,1000]},3 "B": { "Login": {"Type": "LP","Name": "41SS676","Pwd": {‘aaa‘:"123456"},"ForToken": 1}}}4 print (recursionSearch(targetDict,‘Name‘))

直接拼装上面代码即可

在成品之前,尝试过几种写法,都无法达到最终要求,进行了一些分析,现记录下来:

1、查找的Key只能是叶子结点,非叶子结点的无法实现查找,代码如下:

1 def recursionSearch(targetDict,serchKey): #递归查找

2 for k,v intargetDict.items():3 if isinstance(v,dict) : #值是字典元素,则递归处理

4 recursionSearch(v,serchKey)5 elif k ==serchKey:6 pp=targetDict[k]7 print(pp)8 return pp

只考虑叶子结点是查询目标

结果:

print (recursionSearch(targetDict,‘kkk‘)) 看到打印出来的叶子结点的值正是我想要查找的Key=‘kkk‘的值‘aaaaaa’,

print (recursionSearch(targetDict,‘Name‘)) 换第二个分支里面的叶子结点,也能看到函数内打印结果41SS676是我想要的

应该是对的,Python输出:

41SS676

None

[Finished in 0.2s]

但为毛函数结果是None呢???

分析:

(1).代码确实能够达到叶子结点查找到目标键名的功能,但。。。还是尝试着换换思路吧

2、更换if条件,不会直接到叶子结点级别才开始查找

1 def recursionSearch(targetDict,serchKey): #递归查找

2 for k,v intargetDict.items():3 if k ==serchKey:4 returnv5 elif isinstance(v,dict) : #值是字典元素,则递归处理

6 recursionSearch(v,serchKey)

任一层查找,但代码还是错误的

分析:

(2).这个程序最后一行只进行了递归调用,但是没有返回递归的值,导致一旦出现递归,则必然返回断档,结果必然是None。无return的函数返回值就是None,Python规定。

参考《Python学习手册第4版》531页 “没有renturn语句的函数”

3、那就把递归调用的返回值也return一下

1 def recursionSearch(targetDict,serchKey): #递归查找

2 for k,v intargetDict.items():3 if k ==serchKey:4 returnv5 elif isinstance(v,dict) : #值是字典元素,则递归处理

6 ret =recursionSearch(v,serchKey)7 return ret

return递归调用的结果

结果:这种代码只能按照第一个元素这条线深入递归下去,无论最终找到或者找不到目标值,都会结束递归。

这种没脑子的增加return直接导致的是:

(1).查找的Key在第一层第一个键值对的值中,且递归调用时,Key也在目标字典的第一个位置,能够返回正确值;

如:Key=‘H‘,Key=‘ACID’,Key=‘kkk’都能返回正确值,如果Key=‘B’,Key=‘CInf’只会返回None

(2).换句话说:for循环里只会使用第一对(k,v)

分析:

(1).必须增加一个处理方法,让程序能够在for循环中循环下去,不能只局限在第一对(k,v)中。

主要就是用莫条件限制return ret是否执行,如果此return不执行,则for能继续循环下去

如果ret是None就继续循环,如果ret不是None就证明找到目标,应该return ret,精简之后语句:if ret is not None: return ret

正向测试:

print (recursionSearch(targetDict,‘H‘))                   #{‘Ver‘: [‘aaaa‘, ‘bbbb‘], ‘ACID‘: {‘kkk‘: ‘aaaaa‘}, ‘CInf‘: [100, 2, 1000]}

print (recursionSearch(targetDict,‘ACID‘))              #{‘kkk‘: ‘aaaaa‘}

print (recursionSearch(targetDict,‘kkk‘’))                #aaaaa

print (recursionSearch(targetDict,‘Ver‘))                 #[‘aaaa‘, ‘bbbb‘]

print (recursionSearch(targetDict,‘B‘))                    #{‘Login‘: {‘Type‘: ‘LP‘, ‘Name‘: ‘41SS676‘, ‘Pwd‘: {‘aaa‘: ‘123456‘}, ‘ForToken‘: 1}}

print (recursionSearch(targetDict,‘Login‘))               #{‘Type‘: ‘LP‘, ‘Name‘: ‘41SS676‘, ‘Pwd‘: {‘aaa‘: ‘123456‘}, ‘ForToken‘: 1}

print (recursionSearch(targetDict,‘Pwd‘))                #{‘aaa‘: ‘123456‘}

print (recursionSearch(targetDict,‘aaa‘))                 #123456

以上均能返回正确目标键的值

逆向测试:

print (recursionSearch(targetDict,‘aaaaaa‘))  #None没有键属性是‘aaaaaa’的,只有一个键的值是‘aaaaaa’,测试函数是否是按键名查找

print (recursionSearch(targetDict,‘B111‘))      #None

以上均能争取返回None

至此,从最初级错误程序,一步一步走到正确程序。

感谢我的同事 相开征  和我不厌其烦的讨论了一天,最终弄清楚了正确程序的原理,也一步一步分析清楚错误程序错在哪里,应该如何改进。

python遍历任意层次字典_Python递归中 return 代码陷阱相关推荐

  1. python用input输入字典_python输入字典_输入字典python_python用input输入字典 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本篇将介绍python里面的字典,更多内容请参考:python学习指南 pyth ...

  2. python遍历多层嵌套列表_python遍历多层嵌套列表

    python 多层嵌套的json内容 怎么获取 如下,已经实现获取json中的指定内容,先在的问题是:有的json目标内容可以首先使用json包的loads函数对json数据进行解析,然后就可以像操作 ...

  3. python常见的语法错误_python编程中常见错误

    python编程培训中常见错误 最后,我想谈谈使用更多python函数(数据类型.函数.模块.类等)时可能遇到的问题.由于篇幅有限,我们试图将其简化,特别是一些高级概念.有关更多详细信息,请阅读学习p ...

  4. python封装 继承 多态 举例_python面向对象中的封装、继承、多态

    封装 可以简单的理解为隐藏一切可以隐藏的实现细节,只向外界提供简单的编程接口.我们在类中定义的方法其实就是把数据和数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以 ...

  5. python解析xml存入字典_Python将XML同级放入字典

    我有一个如下所示的xml: 1 some text some text 1 a a 2 b b 3 c c 2 some text some text 1 aa aa 2 bb bb 3 cc cc ...

  6. python遍历字符串存入列表_Python遍历字符串的4种方式

    码农公社  210.net.cn  210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. Python遍历字符串的4种方式 1.下标法 2.for in 3.iter内 ...

  7. python使用mysql实例教程_Python操作Mysql实例代码教程在线版(查询手册)_python

    实例1.取得MYSQL的版本 在windows环境下安装mysql模块用于python开发 MySQL-python Windows下EXE安装文件下载 复制代码 代码如下: # -*- coding ...

  8. 根据前序和后序遍历构造二叉树(附前序中序代码)

    889. 根据前序和后序遍历构造二叉树 前序和中序 道理相同 改变一些细节就可以了,在最后附上了前序中序的代码 题目描述 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值 ...

  9. 关于递归中return的理解(最浅显易懂)

    递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就调用下一层,因此,当达到递归终止 ...

最新文章

  1. 转-完成端口高效的三个原因
  2. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
  3. 牛顿迭代法(Newton's Method)
  4. 【数理知识】《矩阵论》方保镕老师-第6章-广义逆矩阵及其应用
  5. PMCAFF问答精选 | 对于用户反馈,产品经理需要第一时间给出回应吗?
  6. 物联网的未来:关于物联网的10个预测
  7. python自然语言分析 何翠仪_如何用 Python 中的 NLTK 对中文进行分析和处理?
  8. servlet提交表单(思考了好多天)
  9. 基于Redis的三种分布式爬虫策略
  10. linux shell中$0,$?,$!等的特殊用法
  11. VBA实战技巧精粹018:如何汇总数据
  12. 翻译记忆库 Translation Memory
  13. 如何成为一个合格的ASF贡献者?
  14. 12月第1周网络安全报告:境内95.8万主机感染病毒
  15. 合并两个有序数组js
  16. 华硕飞行堡垒扬声器没声音_华硕飞行堡垒FX50J音频系统是什么?FX50J有扬声器吗?...
  17. [Android Studio] 添加Override/Implement methods
  18. axure命令行_axure怎么计算器
  19. Java PCM音频变声
  20. usermod -a -G group1 user1

热门文章

  1. 想回家吗?先用腾讯刚上线的这个功能查一查!
  2. 何为 Serverless 架构模式?这 5 大场景来告诉你!
  3. mysql 新建子查询_Mysql创建SQL子查询ALIAS
  4. android电话api,Android电话信息相关API
  5. 使用uniapp开发婚庆应用的时候开发公共组件请求网络数据的方式
  6. YOLO-ReT让边缘端也可以实时检测
  7. 一文读懂GAN, pix2pix, CycleGAN和pix2pixHD
  8. js MediaSource h264
  9. boost库之tcp server(异步)
  10. CNN中的采样和池化心得