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]]]],和预期结构不符。
错误原因
- 基础笔误:定义的列表变量名为
my_list,循环中却使用了未定义的变量a - 填充逻辑完全不匹配层级要求:
- 最内层行长度不统一:
[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
相关产品推荐
相关产品推荐

