python-3.x - Python 中递归乐趣的返回值
问题描述
我正在尝试编写一个函数,该函数将字典作为值,如果字典中存在键则返回。我调试了函数,我发现即使函数输入了应该返回 True 的代码,它仍然在调用其他递归调用,并且返回 none 而不是初始 True 值。
功能:
def checkIfKeyExsists(self,searchKey,passingValue):
if searchKey in passingValue:
return True
else:
for value in passingValue.values():
if type(value) == dict:
if searchKey in value.keys():
print("yes")
return True
else:
self.checkIfKeyExsists(searchKey,value)
elif type(value) == list:
for dicInLst in value:
self.checkIfKeyExsists(searchKey,dicInLst)
我使用的字典:
thisdict = {
"brand": "Ford",
"model": {"Mustang":{"car":"motti","car123":"34"}},
"year": [{"a":"test"},{"c":"er"}] }
jn = JsonNode(thisdict)
x = jn.checkIfKeyExsists("car",jn.getJsonDic())
**此函数是调用 JsonNode 的类的一部分
解决方案
您的递归函数存在三个问题。
首先,您不会在函数结束时返回任何内容。那么,如果您不属于代码的不同分支,会发生什么?然后该函数将返回 None 如您所见。所以首先你应该用return False
.
其次,您不对递归调用返回的值做任何事情。因此,这个值被忽略了。所以这就是为什么即使找到密钥,你也会继续执行递归调用。你应该这样做:替换
self.checkIfKeyExsists(searchKey,dicInLst)
经过
if(self.checkIfKeyExsists(searchKey,dicInLst)):
return True
最后,它不会影响您的函数的正确性,但您的检查if searchKey in value.keys()
实际上是无用的,因为它if searchKey in passingValue
在执行递归调用时已经作为第一个测试 ( ) 执行。因此,您的递归调用 ( ) 将涵盖这种情况self.checkIfKeyExsists(searchKey,value)
。
推荐阅读
- c++ - 如何在不调用析构函数的情况下将值移出 std:optional ?
- powershell - Importing a .csv after prompting for file path for AD account creation in Powershell
- javascript - 目的是什么在 React 类渲染函数中?
- flutter - 升级颤振后包无法在pub中解决
- mysql - 如何通过匹配列名将列数据从一个表复制到另一个表?在 SQL 或 Power Query 中
- vue.js - vue 组件中的 svg.js
- c++ - 什么是数据类型
::work_type 为? - c# - 如何在 cshtml 视图中使用 Asp .NET Core MVC 中的变量?
- progress-bar - 在 wpInstalling 页面上显示多个图像(幻灯片)
- google-analytics - ga:producBrand 和 ga:productVariant 行为不一致