Python遍历列表以获取字典值

时间:2020-11-09 15:37:06

标签: python list dictionary

我有一个列表对象,我想递归地迭代直到找到具有“主机名”值的“节点”并通过其代码计数状态。 问题是我可以在彼此内部随机地有多个“节点”。

免责声明:我不是开发人员,只是一个发烧友,所以请放心! :)

我已经尝试过一堆循环(例如,一会儿等等)来调用一些函数来验证节点的内容,但是当我彼此之间有多个节点时,这会使我失败。

任何帮助将不胜感激, 干杯,

[
    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",
]

1 个答案:

答案 0 :(得分:1)

您可以递归检查列表,以查找具有nodes属性的hostname

(PS:您的原始列表中有一些我必须修复的语法错误)

如果您的列表是这样的变量:

my_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",
]

然后您可以使用如下函数:

def find_nodes(to_check):
    
    nodes = []
    
    if type(to_check).__name__ != "list":
        return nodes
    
    for element in to_check:
        if type(element).__name__ == "dict":
            if "hostname" in element:
                nodes.append(element)
            if "nodes" in element:
                nodes.extend(find_nodes(element["nodes"]))
                
    return nodes
    
    
print(find_nodes(my_list))