Python中遍历多列表匹配车站信息并构建图实现A*最短路径搜索
解决车站ID与名称/线路匹配问题
核心思路
别用嵌套循环遍历两个车站列表做匹配,这逻辑完全错了——你要处理的是每一组对应的station1[x]、station2[x]、line[x]、time[x],应该先把ID和名称的映射做成字典,这样能O(1)时间查找,效率高还不容易出错。
步骤1:构建ID-名称映射字典
把stationId和stationName、lineName转换成字典,快速通过ID查名称:
# 车站ID转名称字典 station_id_to_name = dict(zip(stationId, stationName)) # 线路ID转名称字典(假设line列表里的ID从1开始对应lineName的顺序) line_id_to_name = dict(zip([str(i+1) for i in range(len(lineName))], lineName)) # 若线路ID规则不同,可根据CSV实际对应关系调整生成方式
步骤2:生成带名称的连接关系(同时构建A*用的邻接表)
遍历四组列表的对应元素,用字典匹配出名称,直接构建适合A*搜索的图结构:
# 初始化邻接表:key为车站名称,value为[(相邻车站, 线路名称, 耗时), ...] graph = {} for s1_id, s2_id, line_id, t in zip(station1, station2, line, time): # 匹配车站名称 s1_name = station_id_to_name[s1_id] s2_name = station_id_to_name[s2_id] # 匹配线路名称 line_name = line_id_to_name[line_id] # 转换耗时为数值类型(A*计算需要) time_cost = int(t) # 双向添加邻接关系(地铁线路是双向通行) if s1_name not in graph: graph[s1_name] = [] graph[s1_name].append( (s2_name, line_name, time_cost) ) if s2_name not in graph: graph[s2_name] = [] graph[s2_name].append( (s1_name, line_name, time_cost) )
之前嵌套循环失败的原因
你之前的代码逻辑是拿station1的每个元素和station2的所有元素做相等判断,这完全偏离需求——你要处理的是同一索引下的station1和station2是一组连接关系,不是找两个列表里重复的ID。
内容的提问来源于stack exchange,提问作者Nedyalko
相关产品推荐
相关产品推荐

