我正在尝试创建一个2d矩阵,以便每个单元格都包含一个字符串列表。矩阵的维度是在创建之前就知道的,我需要从一开始就访问任何元素(而不是动态填充矩阵)。=>我认为需要对空间进行某种预分配。
例如,我希望有一个2X2矩阵:
[['A','B'] ['C'];
['d'] ['e','f','f']]支持传统的矩阵访问操作,如
(Matrix[2][2]).extend('d')或
tmp = Matrix[2][2]
tmp.extend('d')
Matrix[2][2] = tmp操作单元格内容。
如何在python中实现?
发布于 2010-11-01 01:59:09
就像你写的那样:
>>> matrix = [["str1", "str2"], ["str3"], ["str4", "str5"]]
>>> matrix
[['str1', 'str2'], ['str3'], ['str4', 'str5']]
>>> matrix[0][1]
'str2'
>>> matrix[0][1] += "someText"
>>> matrix
[['str1', 'str2someText'], ['str3'], ['str4', 'str5']]
>>> matrix[0].extend(["str6"])
>>> matrix[0]
['str1', 'str2someText', 'str6']只需将2D矩阵视为列表的列表。其他操作也可以正常工作,例如,
>>> matrix[0].append('value')
>>> matrix[0]
[0, 0, 0, 0, 0, 'value']
>>> matrix[0].pop()
'value'
>>> 发布于 2010-11-01 02:05:37
您可以使用以下基本命令执行此操作:
matrix = [
[["s1","s2"], ["s3"]],
[["s4"], ["s5"]]
]或者,您可以非常通用地执行此操作。
from collections import defaultdict
m = defaultdict(lambda : defaultdict(list))
m[0][0].append('s1')在defaultdict的情况下,你有一个可以使用的任意矩阵,任何大小,所有的元素都是数组,需要进行相应的操作。
发布于 2010-11-01 04:57:54
首先,您所描述的实际上是一个3维矩阵,因为每个“单元格”也有一个维度,其ith行的jth列的kth元素可以通过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] (忽略在Python语言中具有特殊含义的可能的负索引)。所以使用Matrix[2][2]是一种尝试,试图访问矩阵的 the 列,该列不存在,甚至在2X2维的预分配矩阵中也不存在。
如果您使用有效的索引值对之一(并删除了不必要的括号)将该语句更改为如下所示,则一切都会很好:
Matrix[1][1].extend('d')因为它不会 IndexError,而会导致2X2矩阵变成:
[
[
['A', 'B'], ['C']
],
[
['d'], ['e', 'f', 'f', 'd']
]
]Bonus实用程序您并没有要求这样做,但这里有一个我编写的方便的函数,可以帮助打印出任意大小的任意类型的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)希望这能有所帮助。
https://stackoverflow.com/questions/4064277
复制相似问题