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