【问题标题】:constucting a matrix with lists of lists in Python [duplicate]用Python中的列表构建一个矩阵[重复]
【发布时间】:2016-09-26 18:18:01
【问题描述】:

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

【问题讨论】:

    标签: python list matrix


    【解决方案1】:

    问题是列表乘法。你没有得到四个列表,你得到一个列表四次。使用

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

    【讨论】:

    • 注意python列表也是零索引的,即第一个元素是0而不是1
    【解决方案2】:

    当您创建初始零矩阵时:

    resultmat = (h+1) * [(l+1) * [0]]
    

    这将创建一个零列表列表。但是,零列表(行)都是对同一个列表的引用。当您更改一个时,它会更改所有其他:

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

    当我将第一个列表更改为包含 1 时,所有列表现在都包含 1,因为它们实际上都是同一个列表。

    虽然 Patrick 的回答是正确的,但这里有一个更易读的代码版本,它可以实现您想要的。它创建一个矩阵,其中每个单元格都是两个索引的总和,然后将第一行和第一列归零。

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

    输出:

    [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
     [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
     [0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
     [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
     [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
     [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
     [0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
     [0, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
     [0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
     [0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]]
    

    【讨论】:

    • 嗯,这有效地解决了我的问题。感谢两位的回答。
    猜你喜欢
    • 2014-02-09
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2014-01-26
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多