递归遍历Python字典返回空list问题排查求助
问题
我尝试递归遍历如下Python字典,期望匹配到名为match的节点时返回该节点对应的list。但当前代码始终返回空list,调试时可见匹配条件已触发,但递归仍返回空值。请问我哪里出错了?
字典数据
{ "apiVersion": "v1", "kind": "Deployment", "metadata": { "name": "cluster", "namespace": "namespace", }, "spec": { "template": { "metadata": { "labels": { "app": "flink", "cluster": "repo_name-cluster", "component": "jobmanager", "track": "prod", } }, "spec": { "containers": [ { "name": "jobmanager", "image": "IMAGE_TAG_", "imagePullPolicy": "Always", "args": ["jobmanager"], "resources": { "requests": {"cpu": "100.0", "memory": "100Gi"}, "limits": {"cpu": "100.0", "memory": "100Gi"}, }, "env": [ { "name": "ADDRESS", "value": "jobmanager-prod", }, {"name": "HADOOP_USER_NAME", "value": "yarn"}, {"name": "JOB_MANAGER_MEMORY", "value": "1000m"}, {"name": "HADOOP_CONF_DIR", "value": "/etc/hadoop/conf"}, { "name": "TRACK", "valueFrom": { "fieldRef": { "fieldPath": "metadata.labels['track']" } }, }, ], } ] }, }, }, }
当前代码
test = iterdict(data, "env") print(test) def iterdict(data, match): output = [] if not isinstance(data, str): for k, v in data.items(): print("key ", k) if isinstance(v, dict): iterdict(v, match) elif isinstance(v, list): if k.lower() == match.lower(): # print(v) output += v return output else: for i in v: iterdict(i, match) return output
预期返回值
[{'name': 'JOB_MANAGER_RPC_ADDRESS', 'value': 'repo_name-cluster-jobmanager-prod'}, {'name': 'HADOOP_USER_NAME', 'value': 'yarn'}, {'name': 'JOB_MANAGER_MEMORY', 'value': '1000m'}, {'name': 'HADOOP_CONF_DIR', 'value': '/etc/hadoop/conf'}, {'name': 'TRACK', 'valueFrom': {...}}]
问题分析与修复
错误原因
你的递归调用没有接收并处理返回值:
- 当递归遍历子字典(
iterdict(v, match))或子列表元素(iterdict(i, match))时,只是调用了函数但没有把返回的结果传递给外层的output,也没有在找到结果后终止外层递归。 - 即使内层递归找到了目标
list并返回,外层函数仍然会继续执行,最终返回初始的空output。
修正后的代码
def iterdict(data, match): output = [] if not isinstance(data, str): for k, v in data.items(): if isinstance(v, dict): # 接收子字典递归的返回值,如果非空则直接返回 res = iterdict(v, match) if res: return res elif isinstance(v, list): if k.lower() == match.lower(): output += v return output else: for i in v: # 接收子列表元素递归的返回值,如果非空则直接返回 res = iterdict(i, match) if res: return res return output test = iterdict(data, "env") print(test)
关键改动说明
- 每次递归调用后,将返回值赋值给
res,如果res不为空(即找到目标),直接返回该结果,终止后续递归。 - 确保内层递归找到的结果能被外层函数捕获并返回,而不是丢失在递归调用中。
内容的提问来源于stack exchange,提问作者iambdot
相关产品推荐
相关产品推荐

