3

我正在尝试以下列方式填充 3D 列表:

l1 = []
for _ in range(5):
    l2 = []
    for _ in range(10):
        l2.append([0] * 20)
    l1.append(l2)

它看起来真的很恶心,我觉得应该有一些方法来使用高阶函数或匿名函数或列表理解来实现这一点。任何 python ninjas 都可以告诉我如何实现这一目标吗?

谢谢!

4

3 回答 3

3

numpy如果您计划进行“矢量化”计算,您可以考虑使用:

l1 = np.zeros((5, 10, 20))

文档。

于 2013-02-20T22:46:25.817 回答
2

试试这个:

[[[0]*20 for _ in xrange(10)] for _ in xrange(5)]

@zch 最初给出的答案有一个非常严重的问题:它在结果矩阵中一遍又一遍地复制相同的列表,因此一个位置的变化将同时反映在其他不相关的位置!

My solution is indeed equivalent to your definition of l1, but written a bit more concisely thanks to the use of list comprehensions. Notice that we're not using the iteration variables, so it's ok to use _ as placeholder. And, assuming you're using Python 2.x, it's a better idea to use xrange because we don't need the list created by range. (If using Python 3.x, it's ok to use range)

于 2013-02-20T23:00:08.503 回答
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)]
于 2013-02-20T22:47:06.110 回答