列表转矩阵代码报错:行列互换时出现索引越界问题求助
问题分析与解决
你的代码核心问题是索引计算逻辑错误,导致部分行列组合下会超出列表的索引范围。
错误原因
你当前用rows * r + c计算元素索引,这个公式完全错误:
- 当
rows=3、columns=4时,虽然没报错,但实际只取了列表前10个元素(索引0-9),剩下的10、11根本没被放入矩阵,只是刚好没触发索引越界; - 当
rows=4、columns=3时,第4行(r=3)的索引计算为4*3 + c,c从0到2,得到的索引是12、13、14,而你的列表最大索引是11,直接触发越界错误。
正确的索引计算应该是columns * r + c——因为每行有columns个元素,第r行的起始索引是r * columns,加上列偏移c就能定位到正确的元素。
修正后的代码
def converttomtx(mylist, rows, columns): # 可选:先校验总元素数是否匹配行列乘积,提前规避错误 if rows * columns != len(mylist): raise ValueError("列表元素数量与行列乘积不匹配") mtx = [] for r in range(rows): lrow = [] for c in range(columns): lrow.append(mylist[columns * r + c]) mtx.append(lrow) return mtx
验证结果
用你的测试列表l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]测试:
converttomtx(l, 3, 4)返回:[[0,1,2,3], [4,5,6,7], [8,9,10,11]](正确覆盖所有元素)converttomtx(l, 4, 3)返回:[[0,1,2], [3,4,5], [6,7,8], [9,10,11]](无越界,结果正确)
内容的提问来源于stack exchange,提问作者Scylla
相关产品推荐
相关产品推荐

