用Python创建一个二维矩阵

25

我创建了一个6x5的二维数组,最初每个单元格都只有None。然后我读取一个文件并在读取数据时将Nones替换为数据。 我首先创建空数组,因为我正在读取的文件中数据顺序未定义。我的第一次尝试是这样的:

x = [[None]*5]*6

由此产生了一些奇怪的错误,现在我理解是因为在列表上使用 * 运算符可能会创建引用而不是副本。

有没有一种简单的一行代码来创建这个空数组?我可以使用一些for循环来构建它,但是这似乎对Python来说太啰嗦了。


3
如果你在处理n维数组,至少应该知道NumPy的存在:http://numpy.scipy.org/ 当然,嵌套列表没有问题,而像NumPy这样添加(大型)依赖项并不总是好事。但是,如果你还不知道它,那么现在你知道了! - Joe Kington
3个回答

42

使用嵌套列表推导:

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

32

这里发生的情况是,该行代码

x = [[None]*5]*6

扩展为

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

现在你有一个包含 6 个指向单例 None 的不同引用的列表。你还有一个只包含一个引用到内部列表的列表作为其第一个且唯一条目。当你将其乘以 6 时,你会得到 5 个对内部列表的更多引用,这是你理解的。但关键是内部列表没有问题,只是外部列表有问题,因此没有必要将内部列表的构造扩展到推导式中。

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

我认为这是尽可能简洁且易读的方式,避免了对任何列表的重复引用。


1

如果您不想使用numpy,可以使用字典来模拟2D数组:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接