【问题标题】:Python NetworkX - get DiGraph from nested dictionariesPython NetworkX - 从嵌套字典中获取有向图
【发布时间】:2018-08-29 18:38:22
【问题描述】:

我正在尝试从嵌套字典在 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 的Documentation 指定:

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

知道我做错了什么吗?

【问题讨论】:

    标签: python graph networkx digraphs


    【解决方案1】:

    您有一个混合输入,它既是 dict of lists,又是 dict of dicts。 Networkx 会将其解释为 dict of lists。
    请参阅following code,在您的情况下,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)
    

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

    【讨论】:

    • 知道了,谢谢。我真的混淆了这两种格式。非常感谢您的代码!
    • 很高兴能帮上忙!
    猜你喜欢
    • 2021-05-10
    • 2014-07-21
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多