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

Python递归遍历嵌套列表,统计带hostname的nodes状态计数

解决多层嵌套列表的递归遍历与状态统计问题

嘿,别担心!作为编程爱好者能折腾到这一步已经超棒了😉 多层嵌套的结构确实容易绕晕,递归刚好是解决这种“不知道有多少层”问题的利器——简单说就是让函数自己调用自己,一层层钻进去找我们要的内容。我来给你写个易懂的Python代码,一步步讲清楚怎么弄。

思路梳理

我们需要做的事情很明确:

  • 遍历这个混合了字符串、字典的复杂列表
  • 遇到包含hostname字段的字典(也就是你说的nodes节点),就把它的state值统计起来
  • 不管嵌套多少层,只要遇到nodes字段,就继续往里面遍历

完整代码(带详细注释)

首先我们用collections.defaultdict来帮我们轻松统计状态数量(不用手动判断键是否存在,新手友好):

from collections import defaultdict

# 初始化一个统计字典,默认值为0
state_counts = defaultdict(int)

def count_hostname_states(item):
    # 如果当前元素是列表,就遍历每个元素递归处理
    if isinstance(item, list):
        for sub_item in item:
            count_hostname_states(sub_item)
    # 如果当前元素是字典,检查有没有我们要的字段
    elif isinstance(item, dict):
        # 检查是否有hostname字段,如果有就统计state
        if "hostname" in item:
            state = item.get("state", 0)  # 防止没有state字段时出错,默认0
            state_counts[state] += 1
        # 检查是否有nodes字段,如果有就递归处理nodes里的内容
        if "nodes" in item:
            count_hostname_states(item["nodes"])
    # 如果是字符串或者其他类型,直接跳过就行
    else:
        pass

# 你的列表对象(修正了原列表里的一个小语法错误:把单独的"nodes": [...]改成了字典)
your_list = [
    u"MY CONTAINER", u"MY APP", "0", "",
    {
        "title": u"MyApp",
        "state": 0,
        "nodes": [
            {
                "title": u"AppStuff01",
                "state": 0,
                "nodes": [
                    {
                        "title": u"HOSTX",
                        "state": 0,
                        "nodes": [
                            {"title": u"CPU ", "hostname": u"HOSTX", "state": 0},
                            {"title": u"Memory ", "hostname": u"HOSTX", "state": 0},
                            {"title": u"Service Y", "hostname": u"HOSTX", "state": 0},
                        ],
                        "currently_active": True,
                    },
                    {
                        "title": u"HOSTX",
                        "state": 0,
                        "nodes": [
                            {"title": u"CPU ", "hostname": u"HOSTX", "state": 0},
                            {"title": u"Memory ", "hostname": u"HOSTX", "state": 0},
                            {"title": u"Service Y", "hostname": u"HOSTX", "state": 0},
                        ],
                        "currently_active": True,
                    },
                ],
                "currently_active": True,
            },
            {
                "title": u"AppStuff02",
                "state": 0,
                "nodes": [
                    {
                        "title": u"MySubApp",
                        "state": 0,
                        "nodes": [
                            {"title": u"Service Y", "hostname": u"HOSTX", "state": 0},
                            {"title": u"Service Y", "hostname": u"HOSTX", "state": 0},
                            {"title": u"Service Y", "hostname": u"HOSTX", "state": 0},
                            {  # 修正语法错误:将键值对转为字典
                                "nodes": [
                                    {
                                        "title": u"Another Random Node",
                                        "state": 0,
                                        "nodes": [
                                            {"title": u"Service Y", "hostname": u"HOSTX", "state": 0},
                                        ],
                                    },
                                ]
                            },
                        ],
                        "currently_active": True,
                    }
                ],
                "currently_active": True,
            },
        ],
        "currently_active": True,
    },
    "0", "0",
]

# 调用函数开始统计
count_hostname_states(your_list)

# 打印结果
print("按state统计的数量:")
for state, count in state_counts.items():
    print(f"state {state}: {count} 个")

代码运行结果

运行上面的代码后,你会得到:

按state统计的数量:
state 0: 10 个

(刚好对应你列表里所有带hostname的节点,一共10个,都是state=0)

关键步骤解释

  1. 递归函数count_hostname_states:

    • 先判断当前元素的类型:是列表就循环每个元素再调用自己;是字典就检查字段;其他类型直接跳过
    • 遇到带hostname的字典,就把对应的state值在统计字典里加1
    • 遇到nodes字段,就对nodes里的内容递归调用函数,继续深入嵌套层
  2. 关于原列表的小修正:
    你给的列表里有个小语法错误:在MySubApp的nodes数组里,最后一个元素写成了"nodes": [...](这是键值对,不是完整字典),我改成了{"nodes": [...]},不然代码会报错。如果你的原始数据不是这样,直接替换成你正确的列表就行。

如果还有哪里看不懂,随时问我,我再给你掰碎了讲😎

内容的提问来源于stack exchange,提问作者rkpt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:28:00