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

Python如何将Jagged不规则嵌套列表补零转为规则多维列表

Python不规则嵌套列表补零对齐方案

问题场景

现有如下4层锯齿状不规则Python嵌套列表:

my_list = [[[[1, 2, 3], [4, 5]], [[6, 7, 8]]]]

原始列表层级结构:

[
    [
        [
            [1, 2, 3],
            [4, 5]
        ],
        [
            [6, 7, 8]
        ]
    ]
]

需要通过补零将其填充为维度统一的规则多维列表,预期输出结构:

[[[[1, 2, 3],
   [4, 5, 0]],

  [[0, 0, 0],
   [0, 0, 0]],

  [[6, 7, 8],
   [0, 0, 0]]]]

原有实现代码运行结果不符合预期,错误代码如下:

my_list = [[[[1, 2, 3], [4, 5]], [[6, 7, 8]]]]
z = [0,0,0]
for i in range(len(a[0])):
  for j in range(len(a[0][i])):
    # if len(a[0][i][j]) != 2:
      a[0][i].append(z)
print(a)

运行后输出为[[[[1, 2, 3], [4, 5], [0, 0, 0], [0, 0, 0]], [[6, 7, 8], [0, 0, 0]]]],和预期结构不符。

错误原因

  1. 基础笔误:定义的列表变量名为my_list,循环中却使用了未定义的变量a
  2. 填充逻辑完全不匹配层级要求:
    • 最内层行长度不统一:[4,5]长度为2,其余行长度为3,需要给短行补单个0到长度3,原逻辑直接追加长度为3的全零列表,相当于多加了一整行
    • 第三层子块数量不统一:预期第三层共有3个2行3列的二维块,原列表只有2个块,且第二个块只有1行,原逻辑没有针对缺的块、缺的行做对应补全,只会无差别追加全零行,导致块内行数超标、缺失块没有补全

实现代码

纯Python实现(无第三方依赖)

先明确各维度对齐的目标尺寸:最外层长度1,第二层长度1,第三层共3个块,每个块2行,每行3个元素。

my_list = [[[[1, 2, 3], [4, 5]], [[6, 7, 8]]]]
# 各维度目标长度
block_cnt_target = 3
row_cnt_target = 2
elem_cnt_target = 3

for l1 in my_list:
    # 先处理已有的块:补全行长度、补全块内行数
    for block in l1:
        # 给现有行补零到目标元素数
        for row in block:
            if len(row) < elem_cnt_target:
                row += [0] * (elem_cnt_target - len(row))
        # 补全块内缺失的行
        if len(block) < row_cnt_target:
            block += [[0]*elem_cnt_target for _ in range(row_cnt_target - len(block))]
    # 补全缺失的整个块
    if len(l1) < block_cnt_target:
        l1 += [
            [[0]*elem_cnt_target for _ in range(row_cnt_target)]
            for _ in range(block_cnt_target - len(l1))
        ]

print(my_list)

运行输出和预期完全一致。

Numpy实现(适合高维/大尺寸数组场景)

import numpy as np

my_list = [[[[1, 2, 3], [4, 5]], [[6, 7, 8]]]]
# 目标维度形状
target_shape = (1, 1, 3, 2, 3)
# 初始化全零数组
res = np.zeros(target_shape, dtype=int)

# 递归填充原始数据
def fill(pos, data):
    if isinstance(data, list):
        for i, v in enumerate(data):
            fill(pos + (i,), v)
    else:
        res[pos] = data

fill(tuple(), my_list)
# 转回原生Python列表
final_list = res.tolist()
print(final_list)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:40:00