我正在尝试实现一个用对象初始化任意大小的列表的函数,类似于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.]]
]
答案 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]]]