1

我正在尝试从嵌套字典在 python 的 NetworkX 中创建一个简单的有向图,但看起来内置初始化并没有构建最终的叶节点。

玩具示例:

class_hierarchy= {-1: ["A", "B"], 
"A":{"A1":[1], "A2":[3,4]}, 
"B": {"B1":[5,6], "B2": [7,8]}}

建筑图:

G = DiGraph(class_hierarchy)

现在让我们看看里面有什么:

G.nodes
Out[86]: NodeView((-1, 'A', 'B', 'A1', 'A2', 'B1', 'B2'))

看起来没有添加最终节点

检查它:

list(G.successors('A'))
Out[88]: ['A1', 'A2']

看起来很合理

但:

list(G.successors('A1'))
Out[89]: []

我不确定为什么会这样?NetworkX 的文档指定:

incoming_graph_data (input graph (optional, default: None)) -- 初始化图的数据。如果 None (默认)创建一个空图。数据可以是 to_networkx_graph() 函数支持的任何格式,目前包括边缘列表、字典的字典、列表的字典等...

知道我做错了什么吗?

4

1 回答 1

2

您有一个混合输入,既是 adict of lists又是 a dict of dictsNetworkx将其解释为dict of lists.
请参阅以下代码,您的data情况在哪里class_hierarchy

if isinstance(data, dict):
        try:
            #this will raise an exception
            return from_dict_of_dicts(data, create_using=create_using,
                                  multigraph_input=multigraph_input)
        except:
            try:
                # this is what is called in your case
                return from_dict_of_lists(data, create_using=create_using)
            except:
                raise TypeError("Input is not known type.")

在您的情况下,networkx需要一个列表邻接表示字典。
例如,预期输入的形式为:key: value-> node u: list of nodes [v1,v2,...,vn] u is connected with(例如,{0: [1,2], 1: [3,4]}。

networkx 对您输入的内容进行如下处理:

G=nx.DiGraph()

edges_list = [((node, nbr)) for node, nbrlist in d.items() for nbr in nbrlist]
# [(-1, 'A'), (-1, 'B'), ('A', 'A1'), ('A', 'A2'), ('B', 'B1'), ('B', 'B2')]

G.add_edges_from(edges_list)

因此,你必须根据你赋予它的含义来改变你的格式。

于 2018-08-29T19:14:29.477 回答