I have this list object that i would like to recursively iterate until i find "nodes" that have "hostname" value and count states by it's code. The problem is i can have multiple "nodes" inside each other randomly.
Disclaimer: I'm no developer, just an enthusiast so go easy on me! :)
I've already tried bunch of loops (for, while and so on) calling some functions to validate the content of nodes, but it keeps me failing when i have multiple nodes inside each other.
Any help would be appreciated, Cheers,
[
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",
]
You can recursively check through your list to find nodes
with hostname
property:
(PS: your original list had some syntax errors that I had to fix)
If your list is a variable like this:
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",
]
Then you can use a function like this:
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))
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.