Python提取矩阵非零元素索引调用addEdge添加边的代码修正
邻接矩阵非零坐标提取代码修正
原有代码问题
- 语法问题:Python强制要求缩进,原代码循环、判断分支内的代码没有正确缩进,运行会直接报语法错误
- 逻辑问题1:
li_r、li_c初始化位置放在了行遍历循环内部,每遍历新的一行就会清空之前存储的索引,最终只能保留最后一行的非零坐标 - 逻辑问题2:最后调用
g.addEdge时使用两层嵌套循环,会将所有行索引和列索引做无差别配对,生成大量不存在的错误坐标,无法得到预期的一一对应坐标对 - 前置代码问题:最初的邻接矩阵创建代码使用了未定义的
ROWS、COLUMNS变量,且行列表追加位置错误,会生成结构异常的矩阵
修正后完整代码
1. 正确初始化n阶邻接矩阵
n = int(input()) adjacency_matrix = [] for i in range(n): current_row = [] for j in range(n): current_row.append(int(input())) adjacency_matrix.append(current_row)
2. 提取非零坐标并调用方法
最简洁的实现不需要单独存储两个索引列表,遍历到非零元素时直接传参调用即可,完全避免索引配对错误:
for row_idx in range(n): for col_idx in range(n): if adjacency_matrix[row_idx][col_idx] != 0: g.addEdge(row_idx, col_idx)
如果需要保留li_r、li_c两个列表存储索引,使用如下写法:
# 列表初始化必须放在所有循环外部 li_r = [] li_c = [] for row_idx in range(n): for col_idx in range(n): if adjacency_matrix[row_idx][col_idx] != 0: li_r.append(row_idx) li_c.append(col_idx) # 按索引顺序一一配对,不要嵌套循环 for i in range(len(li_r)): g.addEdge(li_r[i], li_c[i])
运行效果验证
用给出的n=3测试矩阵运行代码:
adjacency_matrix = [ [2,3,0], [0,0,1], [1,5,0] ]
最终得到li_r = [0,0,1,2,2]、li_c = [0,1,2,0,1],会按顺序执行如下调用,和预期完全一致:
g.addEdge(0,0) g.addEdge(0,1) g.addEdge(1,2) g.addEdge(2,0) g.addEdge(2,1)
内容的提问来源于stack exchange,提问作者ebrahim
相关产品推荐
相关产品推荐

