python中的列表2d数组

2024-04-25 08:52:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个二维矩阵,以便每个单元格包含一个字符串列表。 矩阵维度在创建之前就已经知道了,我需要从一开始就访问任何元素(不动态填充矩阵)。=>;我认为需要某种空间的预分配。

例如,我想要一个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实现?


Tags: 字符串gt元素内容列表空间动态矩阵
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]是试图访问矩阵的第三行的第三列,该列不存在,甚至在维度为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)

希望这有帮助。

就像你写的:

>>> 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'
>>> 

你可以用基本的:

matrix = [
   [["s1","s2"], ["s3"]],
   [["s4"], ["s5"]]
]

或者你可以做得很一般

from collections import defaultdict
m = defaultdict(lambda  : defaultdict(list))
m[0][0].append('s1')

在defaultdict的情况下,您可以使用任意矩阵,任何大小和所有元素都是数组,以便进行相应的操作。

相关问题 更多 >