python - 从 dicts descripton 的 python dict 创建加权 NetworkX DiGraph
问题描述
我有一本这样的 Python 字典:{0: {1: 10, 2: 1}, 1: {2: 1}, 2:{3: 1}, 3: {1: 1}}
顶部字典的每个键都是一个原始节点,值字典的每个键都是它的可访问节点,它的值是去那里的成本。例如,您可以使用 cost从0
到。1
10
现在我想从中构建一个NetworkX DiGraph
。阅读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())
推荐阅读
- google-chrome - 我如何修改字体以在多个设备中获得相同的结果
- typescript - 在客户端 Typescript 文件中导入 socket.io 时未捕获 TypeError
- r - 创建具有均值和置信区间的 ggplot
- javascript - 在 ThreeJS 中使用新的 PlaneBufferGeometry 访问顶点
- python - 贪心算法将数字列表列表分成两个分区,Python中每个数字的数量相同
- apache-spark - Petastorm:parquet 文件中的非原始数据类型
- r - 在R中,提取一定长度或更长的所有子字符串
- json - Flutter json 1处的意外字符
- java - 在 Spring Boot 应用程序中使用 JAX-RS 的 Swagger UI (SpringFox) - 无法加载 API 定义
- javascript - webstomp JS - 尝试发送rabbitmq消息时拒绝非环回访问