代码之家  ›  专栏  ›  技术社区  ›  reverload

从dicts描述符的python dict创建加权NetworkX有向图

  •  2
  • reverload  · 技术社区  · 7 年前

    我有一本像这样的Python字典: {0: {1: 10, 2: 1}, 1: {2: 1}, 2:{3: 1}, 3: {1: 1}}

    如果顶级字典的每个键都是一个源节点,那么值字典的每个键都是它的一个可访问节点,它的值就是到达该节点的成本。例如,你可以从 0 1 10 .

    现在我想构造一个 网络X DiGraph 从它那里。阅读 网络X nx.DiGraph(incoming_graph_data=my_dict_of_dicts) 使

    有人知道发生了什么吗?

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dani Mesejo    7 年前

    您需要更改内部词典,例如convert {1: 10, 2: 1} {1: {'weight': 10}, 2: {'weight': 1}} . 看到了吗 this

    import networkx as nx
    
    my_dict_of_dicts = {0: {1: 10, 2: 1}, 1: {2: 1}, 2: {3: 1}, 3: {1: 1}}
    
    for k, d in my_dict_of_dicts.items():
        for ik in d:
            d[ik] = {'weight': d[ik]}
    
    g = nx.DiGraph(my_dict_of_dicts)
    
    for s, t, w in g.edges(data=True):
        print(s, t, w)
    

    输出

    0 1 {'weight': 10}
    0 2 {'weight': 1}
    1 2 {'weight': 1}
    2 3 {'weight': 1}
    3 1 {'weight': 1}
    

    或者也可以使用生成器表达式:

    import networkx as nx
    
    my_dict_of_dicts = {0: {1: 10, 2: 1}, 1: {2: 1}, 2: {3: 1}, 3: {1: 1}}
    g = nx.DiGraph((k, v, {'weight': weight}) for k, vs in my_dict_of_dicts.items() for v, weight in vs.items())
    
    for s, t, w in g.edges(data=True):
        print(s, t, w)
    

    输出

    0 2{“权重”:1}
    2 3{“权重”:1}
    3 1{“权重”:1}
    

    更新

    如@eduhs所述,您需要添加未连接的顶点,因此您可以在创建图形后添加这条线:

    g.add_nodes_from(my_dict_of_dicts.keys())