首先,你描述的实际上是一个三维矩阵,因为每个“单元格”还有一个维度,其第i
行的第j
列的第k
个元素可以通过matrix[i][j][k]
访问。
无论如何,如果你想预分配一个2X2的矩阵,并将每个单元格初始化为空列表,这个函数可以帮助你:
def alloc_matrix2d(W, H):
""" Pre-allocate a 2D matrix of empty lists. """
return [ [ [] for i in range(W) ] for j in range(H) ]
然而,您可能认为它没有起作用,因为我注意到您说您想要一个像这样的2X2矩阵:
[
[
['A','B'], ['C']
],
[
['d'], ['e','f','f']
]
]
并且能够使用“传统的矩阵访问操作”来完成这个过程:
(Matrix[2][2]).extend('d')
问题在于,即使针对所示的矩阵,这也不起作用,对于预先分配为2X2的矩阵同样如此,因为行和列的维度都超出了范围。在Python中,所有序列都从零开始索引,因此具有两个元素的两行矩阵的有效索引是
[0][0]
、
[0][1]
、
[1][0]
和
[1][1]
(忽略可能具有特殊含义的负索引)。因此,使用
Matrix[2][2]
是试图访问不存在的矩阵的第
三行的第
三列,即使是预先分配为2X2的矩阵,也是如此。
如果您将该语句更改为以下内容之一,并删除不必要的括号,则一切都会正常:
Matrix[1][1].extend('d')
由于它不会引发IndexError
,而是导致2x2矩阵变为:
[
[
['A', 'B'], ['C']
],
[
['d'], ['e', 'f', 'f', 'd']
]
]
额外工具
虽然你没有要求,但我写了一个方便的函数来帮助打印任意大小的2D矩阵,无论其类型如何(用嵌套的lists
表示):
def repr_matrix2d(name, matrix):
lines = ['{} = ['.format(name)]
rows = []
for row in range(len(matrix)):
itemreprs = [repr(matrix[row][col]) for col in range(len(matrix[row]))]
rows.append('\n [\n {}\n ]'.format(', '.join(itemreprs)))
lines.append('{}\n]'.format(','.join(rows)))
return ''.join(lines)
希望这能帮到你。