You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:05:32