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

如何根据给定行列数据生成空值填充为0的矩阵

行列分组数据补全重建矩阵方案

问题所属场景

这类需求常见于带合并单元格的表格解析流程(比如Excel、HTML表格的合并单元格拆分后数据还原),属于结构化表格数据重建的子问题,开发场景中一般称其为合并单元格拆分后的空值补全,没有专门的学术专有名称。

核心实现思路

你之前的代码出现索引越界,核心原因有两个:

  • 初始化矩阵时行列维度写反:目标矩阵是4行2列,原代码生成的是2行4列
  • 手动维护x/y双游标遍历的逻辑过于复杂,边界判断极易出错

最简洁的实现逻辑不需要复杂的游标跳转:

  • 最终矩阵的行数等于rows数组长度,列数等于columns数组长度,先将矩阵所有位置初始化为0
  • 预处理列分组数据,建立「值 -> 所属列索引」的映射表,避免重复查找
  • 逐行遍历行分组数据,对每个非空值,通过映射表找到它对应的列位置,直接填充到矩阵对应坐标即可

代码实现

Python 版本

def build_complete_matrix(rows_group, cols_group):
    # 初始化全0矩阵
    matrix = [["0" for _ in range(len(cols_group))] for _ in range(len(rows_group))]
    # 构建值到列索引的映射
    col_index = {}
    for c_idx, col_vals in enumerate(cols_group):
        for val in col_vals:
            col_index[val] = c_idx
    # 逐行填充非空值
    for r_idx, row_vals in enumerate(rows_group):
        for val in row_vals:
            matrix[r_idx][col_index[val]] = val
    return matrix

# 测试用例
if __name__ == "__main__":
    rows = [
        ["A", "E"],
        ["B"],
        ["C", "G"],
        ["H"]
    ]
    cols = [
        ["A", "B", "C"],
        ["E", "G", "H"]
    ]
    result = build_complete_matrix(rows, cols)
    for line in result:
        print(line)

运行输出完全符合预期:

['A', 'E']
['B', '0']
['C', 'G']
['0', 'H']

修正后的 Dart 版本

void main() {
  produceTable();
}

void produceTable() {
  final columns = [
    ["A", "B", "C"],
    ["E", "G", "H"]
  ];
  final rows = [
    ["A", "E"],
    ["B"],
    ["C", "G"],
    ["H"]
  ];

  // 正确初始化4行2列的全0矩阵
  final table = List.generate(
    rows.length, 
    (_) => List.generate(columns.length, (_) => "0")
  );
  
  // 预处理值到列索引的映射
  final Map<String, int> colIndexMap = {};
  for (int colIdx = 0; colIdx < columns.length; colIdx++) {
    for (String val in columns[colIdx]) {
      colIndexMap[val] = colIdx;
    }
  }

  // 逐行填充非空值
  for (int rowIdx = 0; rowIdx < rows.length; rowIdx++) {
    for (String val in rows[rowIdx]) {
      final int? targetCol = colIndexMap[val];
      if (targetCol != null) {
        table[rowIdx][targetCol] = val;
      }
    }
  }

  // 打印结果
  for (final row in table) {
    print(row);
  }
}

复杂度说明

该实现时间复杂度为O(M+N)(M为所有单元格总数量,N为列分组值总数量),比多层循环比对的逻辑效率高很多,也不存在游标越界的风险。

内容的提问来源于stack exchange,提问作者TopologyG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:51:18