从dicts描述的python dict创建加权NetworkX DiGraph

时间:2018-10-11 15:31:20

标签: python dictionary networkx

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

在顶级字典的每个键是一个原始节点的情况下,值字典的每个键是从中可访问的节点,其值是到达那里的成本。例如,您可以以成本0110

现在,我想从中构造一个 NetworkX DiGraph。阅读 NetworkX 的文档,我了解到可以使用nx.DiGraph(incoming_graph_data=my_dict_of_dicts)来制作DiGraph,但是在创建节点时会损失节点之间的成本。

有人知道发生了什么事吗?

非常感谢您。

1 个答案:

答案 0 :(得分:1)

您需要更改内部字典,例如将{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 1 {'weight': 10}
0 2 {'weight': 1}
1 2 {'weight': 1}
2 3 {'weight': 1}
3 1 {'weight': 1}

更新

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

g.add_nodes_from(my_dict_of_dicts.keys())