关于列表:在python中创建一个2d矩阵

Creating a 2d matrix in python

我创建了一个6x52d数组,最初每个单元格中都没有。然后我读了一个文件,在我读的时候用数据替换它们。我首先创建空数组,因为我正在读取的文件中的数据顺序未定义。我的第一次尝试是:

1
x = [[None]*5]*6

这导致了一些我现在理解的奇怪错误,因为列表上的*操作符可能创建引用而不是副本。

是否有一个简单的一行程序来创建这个空数组?我可以为循环做一些并构建它,但对于Python来说,这似乎是不必要的冗长。


使用嵌套的理解列表:

1
x = [[None for _ in range(5)] for _ in range(6)]

这是怎么回事?

1
x = [[None]*5]*6

扩展到

1
x = [[None, None, None, None, None, None]]*6

此时,您有一个列表,其中有6个不同的引用单体None。您还拥有一个引用内部列表的列表,因为它是第一个也是唯一的条目。当你把它乘以6,你就会得到5个你所理解的对内部列表的引用。但重点是内部列表没有问题,只是外部列表,所以不需要将内部列表的结构扩展到理解中。

1
x = [[None]*5 for _ in range(6)]

这避免了对任何列表的重复引用,并且尽可能简洁明了,我相信这是可读的。


如果你不走麻木的路线,你可以用字典来伪造二维数组:

1
2
3
>>> x = dict( ((i,j),None) for i in range(5) for j in range(6) )
>>> print x[3,4]
None