首页 > 解决方案 > 创建非对称多维数组

问题描述

语境

我还没有找到关于如何在 python 中创建“非对称*”多维数组的通用问题。*对于不对称,我的意思是一些元素本身就是数组,它们的长度不同。

尝试 0

second_dim = [1,2]
second_dim[0] = [1,5] 
second_dim[1] = [1,5,9]
list = [ [ [ [ '' for i in range(2) ] for j in range(len(second_dim[i])) ] for k in range(5) ] for l in range(6) ]  

请注意,这会产生错误:undefined name i

问题

如何使用参数在 python 中构造这样一个数组?

^假设:

标签: pythonarrays

解决方案


我真的不确定您的示例是什么意思,但这可能会有所帮助。

如果您在这样的列表中定义所需的尺寸:

dims = [ 
  [4, 5],
  [5, 6, 2],
]

您可以使用一个非常简单的递归函数:

def make_dims(dims, fill_func=int):
  if isinstance(dims, int):
    return [fill_func() for _ in range(dims)]
  return [make_dims(x, fill_func) for x in dims]

l = make_dims(dims)

创建具有“维度”的列表列表,如下所示:

len(l) == len(dims) == 2
len(l[0]) == len(dims[0]) == 2
len(l[0][0]) == dims[0][0]) == 4
len(l[0][1]) == dims[0][1]) == 5
len(l[1]) == len(dims[1]) == 3
len(l[1][0]) == dims[1][0] == 5
len(l[1][1]) == dims[1][1] == 6
len(l[1][2]) == dims[1][2] == 2

并且所有最后一级元素都是fill_func()生产者返回的任何内容。


对于您的示例second_dim = [[1, 5], [1, 5, 9]],调用make_dims(second_dim)只是开箱即用。

但是,如果您确定您不需要此解决方案提供的更多维度的灵活性并且您坚持使用列表理解,那么您的“尝试 0”就不会太远了。但是,您只需要更好地跟踪正在处理的值:

[[[0 for _ in range(y)] for y in x] for x in second_dim]

推荐阅读