简体   繁体   English

python中的二维列表数组

[英]2d array of lists in python

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中完成它?

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.只需将 2D 矩阵视为列表列表。 Other operations also work fine, for example,其他操作也可以正常工作,例如,

>>> matrix[0].append('value')
>>> matrix[0]
[0, 0, 0, 0, 0, 'value']
>>> matrix[0].pop()
'value'
>>> 

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 情况下,您有一个可以使用的任意矩阵,任何大小,所有元素都是数组,可以相应地进行操作。

First of all, what you describe is actually a 3 dimensional matrix since each 'cell' also has a dimension whose kth element of the jth column of the ith row could be accessed via matrix[i][j][k] .首先,您所描述的实际上是一个 3 维矩阵,因为每个“单元格”也有一个维度,其kth ithjth列的ith kth元素可以通过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.问题是即使对于显示的矩阵也不起作用,并且对于预先分配给 2X2 的矩阵仍然不起作用,因为在任何一种情况下行和列尺寸都超出范围。 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).在 Python 中,所有序列都从零开始索引,因此具有两行两个元素的矩阵的有效索引为[0][0][0][1][1][0][1][1] (忽略在 Python 中具有特殊含义的可能的负索引)。 So using Matrix[2][2] is an attempt to access the third column of the third row of the matrix which don't exist and wouldn't even in a preallocated one with dimensions of 2X2.因此,使用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 not raise an IndexError and instead would result in the 2X2 matrix becoming:因为它不会引发IndexError而是会导致 2X2 矩阵变为:

[
    [
        ['A', 'B'], ['C']
    ],
    [
        ['d'], ['e', 'f', 'f', 'd']
    ]
]

Bonus Utility You 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 矩阵(表示为嵌套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.希望这会有所帮助。

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/ .看看这里: http : //www.penzilla.net/tutorials/python/classes/ Acessing a 2d elment in 1d is y * rowSize + x.在 1d 中访问 2d 元素是 y * rowSize + x。 Extending the elements by writing an append function, which would use append rowSize times.通过编写 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.您可以将 None 替换为您想要的值。 And you can use .extend to add additional values.您可以使用 .extend 添加其他值。

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)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM