Python移除矩阵全零列的函数失效问题求助
移除矩阵中全0列的问题修复
原函数的问题点
原代码存在几个潜在问题,导致无法稳定运行:
- 当输入矩阵为空(
matrix = [])或矩阵内有空白行时,len(matrix[0])会触发IndexError - 若矩阵各行长度不一致,遍历列索引时会出现索引越界错误
- 直接修改原矩阵的行元素,会对传入的原始矩阵造成意外修改(如果需要保留原数据的话)
修复后的实现方案(兼容边界+无副作用)
def remove_column_with_all_zeros(matrix): # 处理空矩阵或全空行的边界情况 if not matrix or not matrix[0]: return [row.copy() for row in matrix] if matrix else [] num_cols = len(matrix[0]) zero_columns = [] # 遍历所有列,标记全0列的索引 for col_idx in range(num_cols): all_zero = True for row in matrix: if row[col_idx] != 0: all_zero = False break if all_zero: zero_columns.append(col_idx) # 生成新矩阵,筛选掉全0列的元素 new_matrix = [] for row in matrix: new_row = [val for idx, val in enumerate(row) if idx not in zero_columns] new_matrix.append(new_row) return new_matrix
更简洁的实现方案(利用矩阵转置)
通过转置矩阵将列转为行,筛选后再转置回来,代码更简洁:
def remove_column_with_all_zeros(matrix): if not matrix: return [] # 转置矩阵,把列转换为行 transposed = list(zip(*matrix)) # 筛选出非全0的"行"(对应原矩阵的列) filtered_cols = [col for col in transposed if not all(val == 0 for val in col)] # 转置回原结构,若筛选后无列则返回对应行数的空列表 if not filtered_cols: return [[] for _ in matrix] return [list(row) for row in zip(*filtered_cols)]
测试示例
# 正常矩阵测试 test_matrix = [ [1, 0, 2], [0, 0, 3], [4, 0, 5] ] print(remove_column_with_all_zeros(test_matrix)) # 输出: [[1, 2], [0, 3], [4, 5]] # 空矩阵测试 print(remove_column_with_all_zeros([])) # 输出: [] print(remove_column_with_all_zeros([[], [], []])) # 输出: [[], [], []]
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

