我有一个像这样的Python字典:{0: {1: 10, 2: 1}, 1: {2: 1}, 2:{3: 1}, 3: {1: 1}}
在顶级字典的每个键是一个原始节点的情况下,值字典的每个键是从中可访问的节点,其值是到达那里的成本。例如,您可以以成本0
从1
到10
。
现在,我想从中构造一个 NetworkX DiGraph
。阅读 NetworkX 的文档,我了解到可以使用nx.DiGraph(incoming_graph_data=my_dict_of_dicts)
来制作DiGraph
,但是在创建节点时会损失节点之间的成本。
有人知道发生了什么事吗?
非常感谢您。
答案 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())