如何从嵌套字典构建有向图? (Python 3 | NetworkX)

How to build directed graph from nested dictionary? (Python 3 | NetworkX)

我正在尝试构建一个分层定向网络,其中一些节点可以分支到其他节点,而其他节点则不能。内部字典中的值(即整数)用于跟踪树状结构中的叶子。我创建了一种天真的方法来将这个特定的嵌套字典 graph_data 转换为有向图,但它仅特定于 3 层。下面显示了层次结构:

我如何创建一个嵌套函数,为任意数量的级别向有向图添加边?例如,如果有一个 level-3level-4 这行不通,我每次都必须扩展它。我需要使用 while 循环吗?

import numpy as np
from collections import *
import networkx as nx

%matplotlib inline

# Hierarchical data
graph_data = {"root": {"level-0.A":0, 
                      "level-0.B":{"level-1.B.1":2, 
                                   "level-1.B.2": {"level-2.B.2.1":3, "level-2.B.2.2":1}}}}
# Empty directed graph
G = nx.DiGraph()

# Helper functions
is_dict = lambda x: type(x) in {dict, OrderedDict, defaultdict}

# Iterate through the layers
for root, level_0 in graph_data.items():
    if len(level_0) > 0:
        for level_0_node, level_1 in level_0.items():
            G.add_edge(root, level_0_node)
            if is_dict(level_1):
                for level_1_node, level_2 in level_1.items():
                    G.add_edge(level_0_node, level_1_node)
                    if is_dict(level_2):
                        for level_2_node, level_3 in level_2.items():
                            G.add_edge(level_1_node, level_2_node)

np.random.seed(8)
nx.draw(G, with_labels=True)

使用队列来保存详细信息,例如:

from collections import Mapping
graph_data = {"root": {"level-0.A":0,
                      "level-0.B":{"level-1.B.1":2,
                                   "level-1.B.2": {"level-2.B.2.1":3, "level-2.B.2.2":1}}}}
# Empty directed graph
G = nx.DiGraph()

# Iterate through the layers
q = list(graph_data.items())
while q:
    v, d = q.pop()
    for nv, nd in d.items():
        G.add_edge(v, nv)
        if isinstance(nd, Mapping):
            q.append((nv, nd))

np.random.seed(8)
nx.draw(G, with_labels=True)