不规则数组是每行长度可独立设定的非矩形数据结构,适用于成绩、日志、树形等天然不齐整的数据;Python用嵌套list自然实现,Java需分步初始化,C++推荐vector组合,转置与操作需定制逻辑。

不规则数组(也称锯齿状数组、变长数组)不是标准的矩形结构,而是每行长度可独立设定的数据容器。它适合表示天然不齐整的数据,比如学生各科成绩条目数不同、日志中每条记录字段数不一、树形结构的层级节点等。关键在于:不规则 ≠ 无结构,而是“行内规则、行间灵活”。
Python 中用列表自然实现
Python 原生 list 天然支持嵌套与变长,是最直接的方式:
- 声明空列表,逐行 append 子列表:
data = [],然后data.append([1, 2])、data.append([3, 4, 5, 6]) - 直接初始化:
jagged = [[1, 2], [3, 4, 5], [6]],无需预设尺寸 - 访问元素仍用双重索引:
jagged[1][2]表示第二行第三列(即5),但需自行校验索引是否越界 - 若需 NumPy 支持(如科学计算),可用
dtype=object包装:np.array(jagged, dtype=object),此时形状为(n,),每个元素是独立的一维 array 或 list
Java 中需分步初始化
Java 的二维数组本质是“数组的数组”,必须显式分配每行空间:
- 先声明并指定行数:
int[][] arr = new int[4][];(4 行,每行暂为空) - 再逐行分配长度:
arr[0] = new int[2]; arr[1] = new int[5]; arr[2] = new int[3]; … - 赋值和遍历时,必须用
arr[i].length获取当前行长度,不能直接用统一列数 - 注意 null 安全:未初始化的行(如
arr[3]若未赋值)为null,访问前应判空
转置与操作需额外逻辑
不规则结构不支持直接矩阵运算,常见操作需定制:
- 转置时不能用
zip(*arr)(会按最短行截断),应改用itertools.zip_longest(*arr, fillvalue=None),再过滤掉填充项 - 求每行最大值、平均值等聚合操作,需外层循环 + 内层对
row单独处理 - 查找某值位置时,需双层循环,并在每行内独立搜索,无法利用列索引加速
- 打印对齐可借助
max(len(row) for row in arr)计算最大宽度,再格式化输出
C++ 中常用指针或 vector 组合
原生数组不支持动态行长,推荐现代 C++ 方案:
- 使用
std::vector<:vector>></:vector>:最接近 Python list,自动管理内存,支持push_back动态扩行扩列 - 若需高性能连续内存,可用一维 vector + 辅助长度数组:把所有数据平铺存储,另用
std::vector<size_t></size_t>记录每行起始偏移或长度 - 避免裸指针手动管理;若必须用,建议封装成类,包含行数、每行长度、数据指针三要素,防止越界

















