首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中列表的二维数组

python中列表的二维数组
EN

Stack Overflow用户
提问于 2010-11-01 01:48:59
回答 6查看 48.1K关注 0票数 8

我正在尝试创建一个2d矩阵,以便每个单元格都包含一个字符串列表。矩阵的维度是在创建之前就知道的,我需要从一开始就访问任何元素(而不是动态填充矩阵)。=>我认为需要对空间进行某种预分配。

例如,我希望有一个2X2矩阵:

代码语言:javascript
复制
[['A','B']          ['C'];
  ['d']       ['e','f','f']]

支持传统的矩阵访问操作,如

代码语言:javascript
复制
(Matrix[2][2]).extend('d')

代码语言:javascript
复制
tmp = Matrix[2][2]
tmp.extend('d')
Matrix[2][2] = tmp

操作单元格内容。

如何在python中实现?

EN

回答 6

Stack Overflow用户

发布于 2010-11-01 01:59:09

就像你写的那样:

代码语言:javascript
复制
>>> 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矩阵视为列表的列表。其他操作也可以正常工作,例如,

代码语言:javascript
复制
>>> matrix[0].append('value')
>>> matrix[0]
[0, 0, 0, 0, 0, 'value']
>>> matrix[0].pop()
'value'
>>> 
票数 10
EN

Stack Overflow用户

发布于 2010-11-01 02:05:37

您可以使用以下基本命令执行此操作:

代码语言:javascript
复制
matrix = [
   [["s1","s2"], ["s3"]],
   [["s4"], ["s5"]]
]

或者,您可以非常通用地执行此操作。

代码语言:javascript
复制
from collections import defaultdict
m = defaultdict(lambda  : defaultdict(list))
m[0][0].append('s1')

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

票数 5
EN

Stack Overflow用户

发布于 2010-11-01 04:57:54

首先,您所描述的实际上是一个3维矩阵,因为每个“单元格”也有一个维度,其ith行的jth列的kth元素可以通过matrix[i][j][k]访问。

无论如何,如果您想预先分配一个2X2矩阵,每个单元格都初始化为一个空列表,此函数将为您完成此操作:

代码语言:javascript
复制
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矩阵,如下所示:

代码语言:javascript
复制
[
    [
        ['A','B'], ['C']
    ],
    [
        ['d'], ['e','f','f']
    ]
]

并能够使用“传统的矩阵访问操作”对其执行此操作:

代码语言:javascript
复制
(Matrix[2][2]).extend('d')

问题是,即使对于所显示的矩阵也不起作用,对于预先分配给2X2的矩阵仍然不起作用,因为行和列的维度在任何一种情况下都超出范围。在Python语言中,所有序列都是从零开始索引的,所以两行两元素的矩阵的有效索引是[0][0][0][1][1][0][1][1] (忽略在Python语言中具有特殊含义的可能的负索引)。所以使用Matrix[2][2]是一种尝试,试图访问矩阵的 the 列,该列不存在,甚至在2X2维的预分配矩阵中也不存在。

如果您使用有效的索引值对之一(并删除了不必要的括号)将该语句更改为如下所示,则一切都会很好:

代码语言:javascript
复制
Matrix[1][1].extend('d')

因为它不会 IndexError,而会导致2X2矩阵变成:

代码语言:javascript
复制
[
    [
        ['A', 'B'], ['C']
    ],
    [
        ['d'], ['e', 'f', 'f', 'd']
    ]
]

Bonus实用程序您并没有要求这样做,但这里有一个我编写的方便的函数,可以帮助打印出任意大小的任意类型的2D矩阵(表示为嵌套lists):

代码语言:javascript
复制
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)

希望这能有所帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4064277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档