将Dict转换为与孩子一起的dict和"无限制"深度

时间:2017-08-16 19:17:01

标签: python dictionary tree children

我试图将当前视图的dict转换为我可以在AngularJS对象中使用它的格式:

 data = "{'root': {'host': {'hostname1': {'10.0.0.1': {}}, 'hostname2': {'10.0.0.2': {}}}, 'monitor': {'bandwidth': {'hostname1': {'10.0.0.1': {'hostname1': {'10.0.0.1': {'10': {}}}, 'hostname2': {'10.0.0.2': {'10': {}}}}}, 'hostname2': {'10.0.0.2': {'hostname1': {'10.0.0.1': {'10': {}}}, 'hostname2': {'10.0.0.2': {'10': {}}}}}}}}}"

使用名称和子值进行格式化,例如:

[{
    name: "Node 1",
    children: [{
        name: "Node 1.1",
        children:[{name:"Node 1.1.1"},{name: "Node 1.1.2"}]
    }]},{
    name: "Node 2",
    children: [{name: "Node 2.1"},{name: "Node 2.2"}]
}]

我尝试了几种不同的方法,但总是收到部分结果。例如,我尝试使用递归,它直到深度值,然后忽略所有其他树。

def modifydict2(data):
for key, value in data.items():
    return [{'name': key, 'children':modifydict2(value)}]

结果我只收到了部分词典。我明白我的循环从未起作用,因为我在下一次迭代之前返回了值,但不知道如何解决这个问题:

[{'name': 'root', 'children': [{'name': 'host', 'children': [{'name': 'ctest1.prod01.weave.local', 'children': [{'name': '10.32.62.1', 'children': None}]}]}]}]

1 个答案:

答案 0 :(得分:1)

您需要将当前返回的各个值附加到列表中,然后返回该列表。或者,使用列表理解:

def modify_dict(d):
    return [{'name': key, 'children': modify_dict(value)}
            for key, value in d.items()]