使用Python

时间:2016-09-26 18:18:01

标签: python list matrix

我尝试在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)我如何解决这个问题?

2 个答案:

答案 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))