Python中的二维矩阵的单元格分配,没有numpy

Stu*_*nce 6 python matrix variable-assignment

下面是我的脚本,它基本上创建了一个填充0的12x8的零矩阵.然后我想逐个填写它.所以说第2列第0行需要是5.我该怎么做?下面的示例显示了我是如何做到这一点以及错误的(对于我的需求)输出:

list_MatrixRow = []
list_Matrix = [] #Not to be confused by what the book calls, optimal alignment score matrix

int_NumbOfColumns = 12
int_NumbOfRows = 8

for i in range (0, int_NumbOfColumns): # Puts Zeros across the first Row
    list_AlignMatrixRow.append(0)
for i in range (0, int_NumbOfRows):
    list_AlignMatrix.append(list_AlignMatrixRow) 
#add the list in another list to make matrix of Zeros
#-------------------THE ACTUAL PROBLEMATIC PART; ABOVE IS FINE(It Works)------------

list_AlignMatrix[2][0] = 5 
# This is what logically makes sense but here is the output 
# which happens but I don't want (there should be all 0s and 
# only one 5 on the cell [2][0]):

[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

Ste*_*ski 9

每行指向相同的子列表.这是重复附加相同子列表的结果.因此,当您修改一行时,最终会修改其他行.

我会这样做:

ncols = 12
nrows = 8
matrix = [[0] * ncols for i in range(nrows)]
matrix[2][0] = 5 
Run Code Online (Sandbox Code Playgroud)

matrix 包含:

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

抛开编码风格:Python中的不良形式是在其名称中包含对象的类型.我选择重命名int_NumbOfColumnsncols.如果你需要的东西更具描述性的使用类似column_count.通常,要避免使用mixedCase名称,而CamelCase通常用于类名.有关更多信息,请参阅PEP 8 - Python代码样式指南.

编辑:既然你提到你是Python的新手,这里有一点解释.

这是列表理解:

matrix = [[0] * ncols for i in range(nrows)]
Run Code Online (Sandbox Code Playgroud)

它也可以写成常规for循环:

matrix = []
for i in range(nrows):
    matrix.append([0] * ncols)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ard 5

每个条目list_AlignMatrix都是对同一对象的引用.您需要为list矩阵中的每一行创建一个新实例.以下是正在发生的事情的说明:

>>> l = [0]
>>> l2 = [l,l,l]
>>> l2
[[0], [0], [0]]
>>> l2[0][0] = 1
>>> l2
[[1], [1], [1]]
Run Code Online (Sandbox Code Playgroud)

您可以使用该id()函数确认每个条目l2是对同一对象的引用:

>>> [id(x) for x in l2]
[161738316, 161738316, 161738316]
Run Code Online (Sandbox Code Playgroud)

要创建行列表的新副本,您可以像这样重写第二个循环:

for i in range (0, int_NumbOfRows):
    list_AlignMatrix.append(list(list_AlignMatrixRow)) 
Run Code Online (Sandbox Code Playgroud)

list构造将创建的副本list_AlignMatrixRow,通过下面的例子所示:

>>> l = range(10)
>>> l2 = list(l)
>>> l == l2
True
>>> l is l2
False
Run Code Online (Sandbox Code Playgroud)