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)
关键步骤解释
递归函数
count_hostname_states:- 先判断当前元素的类型:是列表就循环每个元素再调用自己;是字典就检查字段;其他类型直接跳过
- 遇到带
hostname的字典,就把对应的state值在统计字典里加1 - 遇到
nodes字段,就对nodes里的内容递归调用函数,继续深入嵌套层
关于原列表的小修正:
你给的列表里有个小语法错误:在MySubApp的nodes数组里,最后一个元素写成了"nodes": [...](这是键值对,不是完整字典),我改成了{"nodes": [...]},不然代码会报错。如果你的原始数据不是这样,直接替换成你正确的列表就行。
如果还有哪里看不懂,随时问我,我再给你掰碎了讲😎
内容的提问来源于stack exchange,提问作者rkpt
相关产品推荐
相关产品推荐

