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)
每行指向相同的子列表.这是重复附加相同子列表的结果.因此,当您修改一行时,最终会修改其他行.
我会这样做:
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_NumbOfColumns为ncols.如果你需要的东西更具描述性的使用类似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)
每个条目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)
| 归档时间: |
|
| 查看次数: |
9827 次 |
| 最近记录: |