从 python dict of dicts descripton 创建一个 Weighted NetworkX DiG



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

其中顶级字典的每个键都是一个源节点,值字典的每个键都是它的可访问节点,它的值是去那里的成本。例如,您可以使用成本100转到1

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

有人知道发生了什么吗?

非常感谢。

您需要更改内部字典,例如将{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())

相关内容

最新更新