如何在单次循环中生成指定结构的矩阵?
问题分析与代码修正
需求回顾
- 列表A:包含100个数值,矩阵C的行数与A长度一致,第一列对应A的每个数值
- 列表B:存储N个索引,矩阵C额外增加N列,每列仅在B中对应的索引位置为1,其余为0
- 示例目标:A = [10,20,30,40],B = [1,3],则C = [[10,0,0],[20,1,0],[30,0,0],[40,0,1]]
你的代码错误点
insert参数顺序完全搞反:list.insert(index, element)是在指定索引位置插入元素,你写的nest.insert(A[i], 0)是把0插到索引为A[i]的位置(比如第一个循环里是索引10),这会把列表无端拉长,完全偏离生成每行的逻辑。- 未正确调用
clear()方法:nest.clear只是方法引用,必须加括号nest.clear()才会执行清空操作,否则你一直在操作同一个列表对象,最终C里的所有元素指向的都是同一个列表,导致输出全部重复。 - 行生成逻辑错误:你没有正确构建每行的结构,错误地用
insert添加第一列和0/1值,导致每行的元素顺序和数量完全不符合需求。
修正后的代码
方式一:外层单次循环+列表推导(符合“单次循环”要求)
A = [10, 20, 30, 40] B = [1, 3] C = [] for i in range(len(A)): # 构建当前行:第一列是A[i],后续列对应B中索引的0/1值 current_row = [A[i]] + [1 if i == idx else 0 for idx in B] C.append(current_row) print(C)
方式二:嵌套循环(逻辑更直观)
A = [10, 20, 30, 40] B = [1, 3] C = [] for i in range(len(A)): current_row = [A[i]] # 为B中的每个索引生成对应列的0/1值 for idx in B: current_row.append(1 if i == idx else 0) C.append(current_row) print(C)
输出结果
[[10, 0, 0], [20, 1, 0], [30, 0, 0], [40, 0, 1]]
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

