递归查找python字典以创建Graphviz

递归查找python字典以创建Graphviz,python,dictionary,recursion,Python,Dictionary,Recursion,我有一本这样的字典: [ { "children": [ { "children": [ { "children": [ { "label": "Something20",

我有一本这样的字典:

[
    {
        "children": [
            {
                "children": [
                    {
                        "children": [
                            {
                                "label": "Something20",
                                "id": 11
                            },
                            {
                                "label": "Something19",
                                "id": 12
                            }
                        ],
                        "label": "Something18",
                        "id": 5
                    },
                    {
                        "children": [
                            {
                                "label": "Something15",
                                "id": 13
                            }
                        ],
                        "label": "Something14",
                        "id": 6
                    }
                ],
                "label": "Something2",
                "id": 2
            },
            {
                "children": [
                    {
                        "children": [
                            {
                                "label": "Something10",
                                "id": 14
                            }
                        ],
                        "label": "Something9",
                        "id": 7
                    },
                    {
                        "label": "Something8",
                        "id": 8
                    }
                ],
                "label": "Somethin7",
                "id": 3
            },
            {
                "children": [
                    {
                        "label": "Something5",
                        "id": 9
                    },
                    {
                        "label": "Something4",
                        "id": 10
                    }
                ],
                "label": "Something2",
                "id": 4
            }
        ],
        "label": "Something1",
        "id": 1
    }
]
我如何通过这个dict递归地搜索以生成如下的Graphviz数据:

Something1->Something2
Something1->Something7
例如,列出名为
edges=[]
的列表,并将一些数据作为标签附加到列表中:


生成数据后,我可以简单地在Graphviz(generate PNG Image)中生成表示所提供字典的树结构的对象。

如果要递归地执行此操作,可以使用一个函数,从节点生成一条边,并将其传递给每个子节点,同时为每个子节点调用自身。然后,您只需为根列表中的每个节点调用它(并且需要收集列表中生成的所有边)。这可以按如下方式实现(
root
保存您的数据):

def get_边(节点):
如果“子节点”不在节点中:#确保节点中有子节点
返回[]
标签=节点[“标签”]
子节点=节点[“子节点”]
结果=[(标签,c[“标签”])用于子对象中的c]#创建边
对于儿童中的c:
expand(get_edges(c))#递归遍历树并收集所有边
返回结果
边=和(映射(获取边,根),[])#创建并合并所有边列表
使用您提供的数据运行此代码会产生以下结果:

[('Something1', 'Something2'), ('Something1', 'Somethin7'), 
 ('Something1', 'Something2'), ('Something2', 'Something18'), 
 ('Something2', 'Something14'), ('Something18', 'Something20'), 
 ('Something18', 'Something19'), ('Something14', 'Something15'), 
 ('Somethin7', 'Something9'), ('Somethin7', 'Something8'), 
 ('Something9', 'Something10'), ('Something2', 'Something5'), 
 ('Something2', 'Something4')]

如果希望递归地执行此操作,可以使用一个函数,该函数从节点生成一条边,并将其传递给每个子节点,同时为每个子节点调用自身。然后,您只需为根列表中的每个节点调用它(并且需要收集列表中生成的所有边)。这可以按如下方式实现(
root
保存您的数据):

def get_边(节点):
如果“子节点”不在节点中:#确保节点中有子节点
返回[]
标签=节点[“标签”]
子节点=节点[“子节点”]
结果=[(标签,c[“标签”])用于子对象中的c]#创建边
对于儿童中的c:
expand(get_edges(c))#递归遍历树并收集所有边
返回结果
边=和(映射(获取边,根),[])#创建并合并所有边列表
使用您提供的数据运行此代码会产生以下结果:

[('Something1', 'Something2'), ('Something1', 'Somethin7'), 
 ('Something1', 'Something2'), ('Something2', 'Something18'), 
 ('Something2', 'Something14'), ('Something18', 'Something20'), 
 ('Something18', 'Something19'), ('Something14', 'Something15'), 
 ('Somethin7', 'Something9'), ('Somethin7', 'Something8'), 
 ('Something9', 'Something10'), ('Something2', 'Something5'), 
 ('Something2', 'Something4')]

不幸的是,它返回TypeError:字符串索引必须是整数。我认为这是因为节点并不总是包含“children”键。我添加了一个检查,以确保节点有子节点。但这解决了代码所遇到的另一个问题(如果节点没有子节点,python将为您提供一个
KeyError:'children'
,而不是您描述的
TypeError
)。我猜数据中有一个节点,它的子节点只是一个字符串,而不是一个字典。我已经用您提供的数据测试了代码,并将结果添加到我的答案中。非常感谢!我发现了类似的情况:if not children:return[]。不幸的是,它返回TypeError:string索引必须是整数。我认为这是因为并非总是节点包含“children”键。我添加了一个检查,以确保节点有子节点。但这解决了代码所遇到的另一个问题(如果节点没有子节点,python将为您提供一个
KeyError:'children'
,而不是您描述的
TypeError
)。我猜数据中有一个节点,它的子节点只是一个字符串,而不是一个字典。我已经用您提供的数据测试了代码,并将结果添加到我的答案中。非常感谢!我发现了类似的事情:如果不是孩子:返回[]。