我尝试在Python3中构建一个包含列表列表的矩阵。 当我实现以下功能时,
def myfunction(h, l):
resultmat = (h+1) * [(l+1) * [0]]
for i in range(1,h):
for j in range(1, l+1):
resultmat[i][j] = i + j
return resultmat
我得到以下结果:
myfunction(2,3)
Out[42]: [[0, 2, 3, 4], [0, 2, 3, 4], [0, 2, 3, 4]]
我曾预料到第一行和第二行将填充零,并且所有其他元素将是行和列索引的总和。这不完全是我在这里得到的,其中每一行都是其他行的副本。有人可以解释一下(a)发生了什么(b)我如何解决这个问题?
答案 0 :(得分:3)
问题是列表乘法。您没有获得四个列表,您将获得四个列表。使用
resultmat = [[0 for i in range(h+1)] for j in range(l+1)]
建立零列表。
编辑:
阅读你的其余问题,你可以在列表理解中完成整个事情
[[i+j if i and j else 0 for i in range(h+1)] for j in range(l+1)]
答案 1 :(得分:1)
创建初始零矩阵时:
<?php
$db_name="webappdb";
$mysql_user="root";
$mysql_pass="";
$server_name="localhost";
$con=mysqli_connect($server_name,$mysql_user,$mysql_pass,$db_name);
if(!$con)
echo Connection Error;
else
echo <h3>Connection Success</h3>
?>
这将创建一个零列表。但是,零列表(行)都是对同一列表的引用。当你改变一个时,它会改变所有其他的:
resultmat = (h+1) * [(l+1) * [0]]
当我将第一个列表更改为包含1时,所有列表现在都包含1,因为它们实际上都是相同的列表。
虽然帕特里克的回答是正确的,但这是一个稍微更易读的代码版本,可以实现你想要的。它创建一个矩阵,每个单元格是两个索引的总和,然后将第一行和第一列归零。
>>> l = 3*[3*[0]]
>>> l
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> l[0][0] = 1
>>> l
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
>>>
输出:
from pprint import pprint
def create_matrix(height, length):
matrix = [ [ i + j for j in range(length) ] for i in range(height) ]
matrix[0] = length*[0] # zero the first row
for row in matrix:
row[0] = 0 # zero the first column
return matrix
pprint(create_matrix(10, 11))