You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归遍历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': {...}}]
问题分析与修复

错误原因

你的递归调用没有接收并处理返回值:

  1. 当递归遍历子字典(iterdict(v, match))或子列表元素(iterdict(i, match))时,只是调用了函数但没有把返回的结果传递给外层的output,也没有在找到结果后终止外层递归。
  2. 即使内层递归找到了目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:00:46