Python实现Dijkstra算法报TypeError: 'bool' object is not subscriptable求助
错误根因
报错触发的核心原因是dijkstra方法中对访问标记列表的初始化逻辑错误:你直接将原本是列表类型的self.vistSet整体赋值为布尔值False,后续在minDist方法中尝试用下标vistSet[v]访问元素时,就会触发「布尔类型不支持下标访问」的类型错误。
错误代码位于dijkstra方法的初始化循环中:
for i in range(self.V): self.distArray[i] = self.INF self.vistSet = False # 此处错误:将整个列表替换为布尔值
修复步骤
- 修正访问标记列表的初始化逻辑:将整体赋值修改为对列表对应下标的元素赋值
def dijkstra(self, srcsize): for i in range(self.V): self.distArray[i] = self.INF self.vistSet[i] = False # 仅修改对应下标的标记值,不替换整个列表 self.distArray[srcsize] = 0 # 剩余原有逻辑保持不变
- 补充
minDist方法的变量初始化,避免极端场景下min_index未定义的报错:
def minDist(self, distArray, vistSet): min = self.INF min_index = 0 # 新增初始值定义 for v in range(self.V): if distArray[v] < min and vistSet[v] == False: min = distArray[v] min_index = v return min_index
- 补全邻接矩阵赋值逻辑:你当前的
storeDist方法仅计算了相邻节点距离,但没有写入self.matrix邻接矩阵,会导致Dijkstra算法无法正常运行,在计算得到distance后添加如下代码:
# 无向图双向赋值,有向图可删除第二行 self.matrix[indexPointA][indexPointB] = distance self.matrix[indexPointB][indexPointA] = distance
- 完善距离计算逻辑:当前
computeDist固定返回0,可根据需求替换为实际的坐标距离计算逻辑,比如欧氏距离实现:
def computeDist (self, a, b): a_node = next(item for item in self.locationList if item[0] == a) b_node = next(item for item in self.locationList if item[0] == b) x1, y1 = float(a_node[1]), float(a_node[2]) x2, y2 = float(b_node[1]), float(b_node[2]) return ((x1-x2)**2 + (y1-y2)**2)**0.5
内容的提问来源于stack exchange,提问作者Lilly Mayo-099
相关产品推荐
相关产品推荐

