python中的2d列表

时间:2010-10-31 17:48:59

标签: python arrays matrix 2d

我正在尝试创建一个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中完成它?

6 个答案:

答案 0 :(得分:9)

就像你写的那样:

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

答案 1 :(得分:4)

你可以用基本的方法做到:

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

或者你可以非常通用地进行

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

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

答案 2 :(得分:4)

首先,您所描述的实际上是一个三维矩阵,因为每个“单元格”也有一个维度,kth行的jth列的ith元素可能是通过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)

希望这有帮助。

答案 3 :(得分:1)

一种选择是编写自己的类,重载[]运算符。在这里查看:http://www.penzilla.net/tutorials/python/classes/。 在1d中获得2d元素是y * rowSize + x。通过编写追加函数来扩展元素,这将使用追加rowSize次。

如果要创建2d矩阵并且需要预分配,则可以执行以下操作:

x,y = 3,3
A = [ [None]*x for i in range(y) ]

您可以使用所需的值替换None。您可以使用.extend添加其他值。

答案 4 :(得分:0)

嘿伙计们不确定这是否有用但这是我用python3.4生成2d列表的方式希望这有用

list=[]
list1=[]
list2=[]
list3=[]
answer1='yes'
answer2='yes'
answer3='yes'

while answer1=='yes':
    item1=input("Please input a list element for your first list:")
    answer1=input("Do you want to continue:")
    list1.append(item1)

while answer2=='yes':
    item2=input("Please input a list element for your second list:")
    answer2=input("Do you want to continue:")
    list2.append(item2)

while answer3=='yes':
    item3=input("Please input a list element for your third list:")
    answer3=input("Do you want to continue:")
    list3.append(item3)

list.append(list1)
list.append(list2)
list.append(list3)

print(list)

答案 5 :(得分:0)

下面是一些扩展二维列表列表的最小示例:

my_list = [ [  [1] for x in range(4) ] for j in range(2) ]
print('initial list is ', my_list)
my_list[0][1].append(9)
print('list after extension is ', my_list)

结果是

initial list is  [[[1], [1], [1], [1]], [[1], [1], [1], [1]]]
list after extension is  [[[1], [1, 9], [1], [1]], [[1], [1], [1], [1]]]