python中的二维列表数组
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4064277/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
2d array of lists in python
提问by Nik
I am trying to create a 2d matrix so that each cell contains a list of strings. Matrix dimensions are known before the creation and I need to have access to any element from the beginning (not populating a matrix dynamically). => I think some kind of preallocation of space is needed.
我正在尝试创建一个二维矩阵,以便每个单元格都包含一个字符串列表。矩阵维度在创建之前是已知的,我需要从一开始就访问任何元素(而不是动态填充矩阵)。=> 我认为需要某种空间预分配。
For example, I would like to have a 2X2 matrix:
例如,我想要一个 2X2 矩阵:
[['A','B'] ['C'];
['d'] ['e','f','f']]
with support of traditional matrix access operations, like
支持传统的矩阵访问操作,例如
(Matrix[2][2]).extend('d')
or
或者
tmp = Matrix[2][2]
tmp.extend('d')
Matrix[2][2] = tmp
to manipulate with cells content.
操作单元格内容。
How to accomplish it in python?
如何在python中完成它?
回答by Klark
Just as you wrote it:
就像你写的那样:
>>> 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']
Just think about 2D matrix as list of the lists. Other operations also work fine, for example,
只需将 2D 矩阵视为列表列表。其他操作也可以正常工作,例如,
>>> matrix[0].append('value')
>>> matrix[0]
[0, 0, 0, 0, 0, 'value']
>>> matrix[0].pop()
'value'
>>>
回答by koblas
You can either do it with the basic:
您可以使用基本的:
matrix = [
[["s1","s2"], ["s3"]],
[["s4"], ["s5"]]
]
or you can do it very genericially
或者你可以很一般地做
from collections import defaultdict
m = defaultdict(lambda : defaultdict(list))
m[0][0].append('s1')
In the defaultdict case you have a arbitrary matrix that you can use, any size and all the elements are arrays, to be manipulated accordingly.
在 defaultdict 情况下,您有一个可以使用的任意矩阵,任何大小,所有元素都是数组,可以相应地进行操作。
回答by scigor
One option is to write your own class, where you overload the [] operator. Take a look for that in here: http://www.penzilla.net/tutorials/python/classes/. Acessing a 2d elment in 1d is y * rowSize + x. Extending the elements by writing an append function, which would use append rowSize times.
一种选择是编写自己的类,在其中重载 [] 运算符。看看这里:http: //www.penzilla.net/tutorials/python/classes/。在 1d 中访问 2d 元素是 y * rowSize + x。通过编写 append 函数来扩展元素,该函数将使用 append rowSize 次。
If you want to create a 2d matrix and you need to preallocate than, you could do the following:
如果要创建二维矩阵并且需要预分配比,可以执行以下操作:
x,y = 3,3
A = [ [None]*x for i in range(y) ]
You can replace None with the value you want. And you can use .extend to add additional values.
您可以将 None 替换为您想要的值。您可以使用 .extend 添加其他值。
回答by martineau
First of all, what you describe is actually a 3 dimensional matrix since each 'cell' also has a dimension whose kthelement of the jthcolumn of the ithrow could be accessed via matrix[i][j][k].
首先,您所描述的实际上是一个 3 维矩阵,因为每个“单元格”也有一个维度,该维度kth的jth行列元素ith可以通过matrix[i][j][k].
Regardless, if you'd like to preallocate a 2X2 matrix with every cell initialized to an empty list, this function will do it for you:
无论如何,如果您想预先分配一个 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) ]
However you might think it's not working because I noticed that you said that you would like to have a 2X2 matrix like this:
但是你可能认为它不起作用,因为我注意到你说你想要一个这样的 2X2 矩阵:
[
[
['A','B'], ['C']
],
[
['d'], ['e','f','f']
]
]
and be able to use "traditional matrix access operations" to do this to it:
并且能够使用“传统矩阵访问操作”来做到这一点:
(Matrix[2][2]).extend('d')
Problem is that won't work even for the matrix shown and still wouldn't for one preallocated to 2X2 since both the row and column dimensions are out of range in either case. In Python all sequences are indexed from zero, so valid indices for a matrix with two rows of two elements each are [0][0], [0][1], [1][0], and [1][1](ignoring possible negative indices which have a special meaning in Python). So using Matrix[2][2]is an attempt to access the thirdcolumn of the thirdrow of the matrix which don't exist and wouldn't even in a preallocated one with dimensions of 2X2.
问题是即使对于显示的矩阵也不起作用,并且对于预先分配给 2X2 的矩阵仍然不起作用,因为在任何一种情况下行和列尺寸都超出范围。在Python所有序列是从零索引的,所以有效索引为一个矩阵具有两个元素各自的两行[0][0],[0][1],[1][0],和[1][1](忽略其具有在Python特殊的意义可能负指数)。因此,使用Matrix[2][2]是尝试访问矩阵第三行的第三列,该列不存在,甚至在尺寸为 2X2 的预分配矩阵中也不存在。
Everything would be fine if you changed that statement to something like this using one of the valid pairs of index values (and with unnecessary parentheses removed):
如果您使用一对有效的索引值(并删除不必要的括号)将该语句更改为这样的内容,一切都会好起来的:
Matrix[1][1].extend('d')
since it would notraise an IndexErrorand instead would result in the 2X2 matrix becoming:
因为它不会引发 anIndexError而是会导致 2X2 矩阵变为:
[
[
['A', 'B'], ['C']
],
[
['d'], ['e', 'f', 'f', 'd']
]
]
Bonus UtilityYou didn't ask for one, but here's a handy function I wrote to help printing out arbitrarily sized 2D matrices of any type (represented as nested lists):
Bonus Utility您没有要求,但这是我编写的一个方便的函数,用于帮助打印任意大小的任何类型的 2D 矩阵(表示为 nested 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)
Hope this helps.
希望这可以帮助。
回答by Craftygeek
Hey guys not sure if this is helpful or not but this is how I generated a 2d list with python3.4 hope this is helpful
嘿伙计们不确定这是否有帮助但这是我使用 python3.4 生成二维列表的方式希望这有帮助
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)
回答by shahar_m
Here's some minimal example that extends 2d list of lists:
这是扩展二维列表列表的一些最小示例:
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)
and the results are
结果是
initial list is [[[1], [1], [1], [1]], [[1], [1], [1], [1]]]
list after extension is [[[1], [1, 9], [1], [1]], [[1], [1], [1], [1]]]
?
?

