首页 > 解决方案 > 从 dicts descripton 的 python dict 创建加权 NetworkX DiGraph

问题描述

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

顶部字典的每个键都是一个原始节点,值字典的每个键都是它的可访问节点,它的值是去那里的成本。例如,您可以使用 cost从0到。110

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

有谁知道发生了什么?

非常感谢。

标签: pythondictionarynetworkx

解决方案


您需要更改您的内部字典,例如转换{1: 10, 2: 1}{1: {'weight': 10}, 2: {'weight': 1}}. 看到这个,这里有一些代码:

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())

推荐阅读