
本文介绍两种高效方法,将一维列表按对角线填充模式(第1行1个元素、第2行2个、第3行3个……)拆分为嵌套列表,支持原地操作与非破坏性处理,并分析边界条件与通用性。
本文介绍两种高效方法,将一维列表按对角线填充模式(第1行1个元素、第2行2个、第3行3个……)拆分为嵌套列表,支持原地操作与非破坏性处理,并分析边界条件与通用性。
在数据结构处理中,常需将线性序列转换为“下三角形”或“对角线填充”形式的二维结构——即第 $i$ 行包含 $i$ 个连续元素($i$ 从 1 开始)。给定输入 data = [15, 14, 13, ..., 1](共15个元素),目标输出为:
[15] [14, 13] [12, 11, 10] [9, 8, 7, 6] [5, 4, 3, 2, 1]
该模式本质是按自然数序列 $1, 2, 3, \dots, k$ 累计切片长度,直到耗尽所有元素。前 $k$ 行总元素数为三角数 $T_k = \frac{k(k+1)}{2}$;本例中 $T_5 = 15$,恰好整除,故结果为完整5行。
✅ 方法一:破坏性迭代(简洁直观)
通过动态截取并更新原列表实现,代码极简,适合一次性打印场景:
data = [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
e = 1
while data:
print(data[:e])
data = data[e:] # 创建新列表,原列表被丢弃
e += 1
⚠️ 注意:此方法会持续创建新列表对象,若 data 初始很大,可能带来内存开销;且原始 data 引用失效,不可复用。
✅ 方法二:非破坏性索引遍历(推荐通用解法)
使用起始索引 i 和当前行长度 j 双变量控制切片,完全保留原始数据:
data = [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
i, j = 0, 1
while i <p>该方案时间复杂度 $O(n)$,空间复杂度 $O(1)$(仅额外两个整数变量),且可轻松封装为可复用函数:</p><pre class="brush:php;toolbar:false;">def diagonal_matrix(lst):
result = []
i, j = 0, 1
while i <h3>? 关键要点与扩展建议</h3>
- 长度验证:若输入长度非三角数(如14或16),最后一行将自动截断或补空(取决于需求),无需特殊处理;
- 泛化能力:上述逻辑适用于任意长度列表,不依赖 end_value 或预估行数;
- 性能对比:相比原问题中基于 round(end_value**0.5)+1 的复杂索引计算,双指针法更鲁棒、易理解、无浮点误差风险;
- 反向应用:若需从对角矩阵还原一维列表,可用 sum(matrix, [])(注意:仅适用于纯列表嵌套)。
掌握这两种模式,可灵活应对图像像素重排、层级树展开、测试用例分组等实际工程场景。











