我有一个像这样的Python字典:{0: {1: 10, 2: 1}, 1: {2: 1}, 2:{3: 1}, 3: {1: 1}}
其中顶级字典的每个键都是一个源节点,值字典的每个键都是它的可访问节点,它的值是去那里的成本。例如,您可以使用成本10
从0
转到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())