初始化任意形状的嵌套列表

时间:2012-04-19 15:18:30

标签: python

我正在尝试实现一个用对象初始化任意大小的列表的函数,类似于numpy数组初始化方法的工作方式。

def fill(shape, object):

我一直在反对这一点,但想不出有办法为任意长度维度做这件事。我猜它会需要某种递归。

以下是所需行为的示例。为简单起见,对象只是浮点数0,但我需要它来处理任何类:

> fill( (2, 3, 4), 0.)
[
 [[ 0.,  0.,  0.,  0.],
  [ 0.,  0.,  0.,  0.],
  [ 0.,  0.,  0.,  0.]]
,
 [[ 0.,  0.,  0.,  0.],
  [ 0.,  0.,  0.,  0.],
  [ 0.,  0.,  0.,  0.]]
]

2 个答案:

答案 0 :(得分:5)

尝试以下递归实现

def fill(shape,value):
    if not shape: return value
    return [fill(shape[1:],value) for i in range(shape[0])]

非递归版

import copy
def fill(shape,value):
    result=value
    for i in reversed(shape):
        result=[copy.deepcopy(result) for j in range(i)]
    return result

答案 1 :(得分:-1)

没有看到任何标准,这是我的尝试 - 可以为* args和** kwargs添加一些东西

In [1]: def fill(dimensions,cls):
   ...:     size_list=[cls()]*dimensions[-1]
   ...:     for dimension in dimensions[:0:-1]:
   ...:         size_list=[size_list]*dimension
   ...:     return size_list
   ...: 

In [2]: print fill((2,3,4),float)
[[[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], [[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]]]