在Python中创建二维矩阵
我创建了一个6行5列的二维数组,最开始每个单元格里都是None。然后我读取一个文件,把读取到的数据放进这些None里。之所以先创建一个空数组,是因为我读取的文件里的数据顺序是乱的。我的第一次尝试是这样的:
x = [[None]*5]*6
结果出现了一些奇怪的错误,现在我明白了,这是因为在列表上使用*运算符可能会创建引用,而不是复制。
有没有简单的一行代码可以创建这个空数组?我可以用一些for循环来构建它,但这样在Python里看起来有点啰嗦。
3 个回答
1
如果你不想使用numpy这个库,你可以用字典来模拟二维数组:
>>> x = dict( ((i,j),None) for i in range(5) for j in range(6) )
>>> print x[3,4]
None
32
这里发生的事情是,这行代码
x = [[None]*5]*6
展开后变成了
x = [[None, None, None, None, None, None]]*6
到这个时候,你有一个列表,其中包含6个指向单例None
的引用。你还有一个列表,它的第一个也是唯一的元素是指向内部列表的引用。当你把它乘以6时,你实际上得到了5个额外的指向内部列表的引用。关键是,内部列表没有问题,只有外部列表有问题,所以没有必要把内部列表的构造展开成一个列表推导式。
x = [[None]*5 for _ in range(6)]
这样做可以避免重复引用任何列表,我认为这已经尽可能简洁易读了。
42
使用嵌套的列表推导:
x = [[None for _ in range(5)] for _ in range(6)]