我正在尝试以下列方式填充3D列表:
l1 = []
for _ in range(5):
l2 = []
for _ in range(10):
l2.append([0] * 20)
l1.append(l2)
它看起来真的很恶心,我觉得应该有一些方法来使用高阶函数或非函数或列表理解来实现这一点。任何python忍者都可以告诉我如何实现这个目标吗?
谢谢!
答案 0 :(得分:3)
答案 1 :(得分:2)
试试这个:
[[[0]*20 for _ in xrange(10)] for _ in xrange(5)]
@zch最初给出的答案有一个非常严重的问题:它在结果矩阵中反复复制相同的列表,因此一个位置的变化将同时反映在其他不相关的位置!
我的解决方案确实等同于您对l1
的定义,但由于使用了列表推导,因此写得更简洁一些。请注意,我们没有使用迭代变量,所以可以使用_
作为占位符。并且,假设您使用的是Python 2.x,最好使用xrange
,因为我们不需要range
创建的列表。 (如果使用Python 3.x,则可以使用range
)
答案 2 :(得分:1)
>>> 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)]