2d数组的零

时间:2012-10-31 12:27:58

标签: python

python中没有数组类型,但为了模拟它我们可以使用列表。我希望用零填充2d数组结构。我的问题是:在这两个表达式中有什么区别,如果有的话:

zeros = [[0 for i in xrange(M)] for j in xrange(M)]

zeros = [[0]*M]*N

zeros会一样吗?通过速度和可读性更好地使用哪一个?

3 个答案:

答案 0 :(得分:44)

您应该使用numpy.zeros。如果这不是一个选项,您需要第一个版本。在第二个版本中,如果更改一个值,它将在列表中的其他位置更改 - 例如:

>>> a = [[0]*10]*10
>>> a
[[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, 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, 0, 0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

这是因为(当你从里到外读取表达式时),你创建了一个10个零的列表。然后,您可以创建一个包含10个零初始列表的10个引用的列表。


请注意:

zeros = [ [0]*M for _ in xrange(N) ]

也可以工作,它避免了嵌套列表的理解。如果表中没有numpy,那么这就是我要使用的表格。

答案 1 :(得分:13)

for Python 3(不再是xrange),首选答案

zeros = [ [0] * N for _ in range(M)]

表示M x N个零的数组

答案 2 :(得分:9)

在第二种情况下,您将创建对同一列表的引用列表。如果您有以下代码:

[lst] * N

lst是对列表的引用,您将拥有以下列表:

[lst, lst, lst, lst, ..., lst]

但是因为结果列表包含对同一对象的引用,如果您更改一行中的值,它将在所有其他行中更改。