使用NetworkX从CSV构建图时报错及边数量异常问题求助
错误原因
- 初始版本中,
starting_station、ending_station、average_time_taken都是存储了全表对应列所有值的列表,直接将整个列表作为节点传入add_edge方法,而列表属于可变不可哈希类型,因此触发unhashable type: 'list'报错。 - 后续修改版本将列表替换为生成器表达式,但仍然将整个生成器对象作为节点传入,生成器本身是独立的Python对象,相当于全程只添加了两个节点(两个生成器实例)和一条边,无法得到完整的图。
正确实现代码
无需重复四次读取文件,单次逐行遍历CSV,每一行对应一条边,直接提取当前行的字段添加边即可:
import networkx as nx import csv import matplotlib.pyplot as plt graph = nx.Graph() filename = "tubedata.csv" with open(filename, 'r', encoding='utf-8') as tube_data: reader = csv.reader(tube_data, delimiter=',') # 如果CSV文件第一行是表头,取消注释下一行跳过表头 # next(reader) for row in reader: start_station = row[0] end_station = row[1] # 将耗时转换为数值类型,避免后续权重计算出错 take_time = float(row[3]) graph.add_edge(start_station, end_station, weight=take_time)
补充说明
如果后续需要基于权重做路径计算,可直接调用networkx内置的最短路径相关方法,权重参数指定为weight='weight'即可。
内容的提问来源于stack exchange,提问作者Mughees Asif
相关产品推荐
相关产品推荐

