python - 生成具有 x 维的嵌套列表
问题描述
我想创建一个返回具有给定形状的矩阵的函数,类似于np.zeros(shape)
在 numpy.
我尝试了以下方法,它有效:
shape = [1,2,3]
x = [ lambda : 0 ]
x.append( lambda : [ x[0]() for _ in range(shape[0])] )
x.append( lambda : [ x[1]() for _ in range(shape[1])] )
x.append( lambda : [ x[2]() for _ in range(shape[2])] )
print(x[-1]())
但是,当我尝试将其自动化以处理如下任意数量的维度时,我得到了 RecursionError。
shape = [1,2,3]
x = [ lambda : 0 ]
for i,s in enumerate(shape):
x.append( lambda: [ x[i]() for _ in range(s)] )
print(x[-1]())
有人知道这里出了什么问题,或者是否有更好的方法来做到这一点?
解决方案
代码的第二个版本的问题是,当 lambda 被执行时,它们将使用 and 的当前值i
,s
这是他们在最后一个循环中获得的值(这里是 2 和 3)。
所以,你在循环中创建的实际上都是
lambda : [ x[2]() for _ in range(3)]
包括 at x[2]
,它将在无限递归中调用自己。
经典的“技巧”是利用在定义时评估默认参数的事实。因此,我们使用 lambdas 的默认参数,它将“捕获”每个定义的值i
和时间:s
shape = [1, 2, 3]
x = [lambda: 0]
for i,s in enumerate(shape):
x.append(lambda i=i, s=s: [ x[i]() for _ in range(s)])
print(x[-1]())
输出:
[[[0], [0]], [[0], [0]], [[0], [0]]]
您还可以使用递归函数构建它,这可能更容易理解:
def nested_list(shape, value):
if len(shape) == 1:
return [value] * shape[0]
return [nested_list(shape[:-1], value) for _ in range(shape[-1])]
shape = [1,2,3]
print(nested_list(shape, 0))
# [[[0], [0]], [[0], [0]], [[0], [0]]]
推荐阅读
- itunes-store - 从 iTunes Search Api 获取最新的 iOS 应用程序
- go - : URL 中的第一个路径段不能包含冒号
- python-3.x - 在 Mac OS X High Sierra 上使用 Python 3.7 构建 OpenCV 4.0.0
- javascript - D3忽略绘图缺失值
- javascript - 如何根据上一个下拉列表中的选择创建新的下拉列表
- react-native - 在 Haste 模块映射中不存在 React Native MQTT 模块`url`
- python - 使用 Python 将文件永久更改为只读
- bootstrap-4 - 如何修复body里面有侧边栏。身体偏移
- html - 在导航栏中将 div 搜索栏居中
- android - Flutter我正在使用小部件错误:初始化程序中只能访问静态成员