我正在尝试用以下方式填充3D列表:
l1 = []
for _ in range(5):
l2 = []
for _ in range(10):
l2.append([0] * 20)
l1.append(l2)它看起来真的很恶心,我觉得应该有一些方法来使用高阶函数或无名函数或列表理解来实现这一点。有没有python忍者可以教我怎么做到这一点?
谢谢!
发布于 2013-02-21 06:47:06
>>> l1 == [[[0]*20]*10]*5
True但是这样就有了别名-例如,更改a[0][1][2]也会更改a[4][5][2],为了避免这种情况,副本是必要的:
[[[0]*20 for i in range(10)] for j in range(5)]发布于 2013-02-21 06:46:26
如果您计划进行“矢量化”计算,可以考虑使用numpy:
l1 = np.zeros((5, 10, 20))The docs.
发布于 2013-02-21 07:00:09
试试这个:
[[[0]*20 for _ in xrange(10)] for _ in xrange(5)]@zch最初给出的答案有一个非常严重的问题:它在结果矩阵中一遍又一遍地复制相同的列表,因此一个位置的更改将同时反映在其他不相关的位置!
我的解决方案实际上等同于您对l1的定义,但由于使用了列表理解,所以编写得更简洁一些。注意,我们没有使用迭代变量,所以可以使用_作为占位符。而且,假设您使用的是Python2.x,因为我们不需要range创建的列表,所以使用xrange是一个更好的主意。(如果使用Python3.x,则可以使用range)
https://stackoverflow.com/questions/14991344
复制相似问题