创建非对称多维数组

时间:2019-06-16 19:24:44

标签: python arrays

上下文

我还没有找到有关如何在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中构造这样的数组?

^假设:

  • 第0维的长度为a = 2
  • 维度0的第一个元素的长度为b = 2
  • 尺寸为0的第二个元素的长度为c = 3
  • 第2维的长度为5,第4维的长度为d = 5
  • 第3维的长度为5,第4维的长度为e = 6

1 个答案:

答案 0 :(得分:1)

我真的不确定示例中的含义,但这可能会有所帮助。

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

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]