首页 > 解决方案 > 添加无值总是给出 0

问题描述

我想创建一个函数,将矩阵中的列中的数字相加并输出由总和组成的向量。但是,如果矩阵中有“无”值,则输出向量会自动获得该列的“无”值。我无法弄清楚如何为“无”值做部分。

我尝试了以下代码。

def sum_matrix (matrix):
    #
    # | 1 2 3 |
    # | 1 2 3 |
    # | 1 2 3 |  ->  |4 8 12|
    # | 1 2 3 |
    # _________
    #   4 8 12
    vektor = [[0] for i in range(0,len(matrix[0]))]
    for j  in range(0, len(matrix[0])):        #rows 0-3 4
        buffer = 0
        for i in range(0, len(matrix)):  #columns 3
            if matrix[i][j] !=None:
                buffer = buffer + matrix[i][j]
                #vektor[j][0] = buffer
            elif matrix[i][j] ==None:
                vektor[j][0] = None
        vektor[j][0] = buffer 
    return vektor

print (sum_matrix ([[0,0,0],[0,0,1],[0,1,0],[0,0,0]]))
print (sum_matrix ([[0,0,0],[0,None,1],[0,1,None],[0,0,0]]))

因为sum_matrix ([[0,0,0],[0,0,1],[0,1,0],[0,0,0]]),我知道[[0],[1],[1]]哪个好。对于 sum_matrix ,即使我应该得到([[0,0,0],[0,None,1],[0,1,None],[0,0,0]]),我仍然得到[[0],[1],[1]][[0],[None],[None]]

标签: pythonfor-loopmultidimensional-array

解决方案


正如我常说的,您应该将矩阵(数学抽象)与其实现(a listof lists)区分开来。

现在,我们在这里所拥有的基本上是list每个lists内部list代表一行的位置,但我们想要获取每列的总和,并附加一个约束,即它应该None包含至少一个None值。

我想说,最简单的方法是将list推导与 结合使用zip,它可以有效地转置您的矩阵:

def sum_matrix(m):
    transposed = zip(*m)
    summed = [[sum(col) if None not in col else None] 
              for col in transposed]
    return summed

print(sum_matrix([[0,0,0],[0,0,1],[0,1,0],[0,0,0]]))
print(sum_matrix([[0,0,0],[0,None,1],[0,1,None],[0,0,0]]))

输出:

[[0], [1], [1]]
[[0], [None], [None]]

注意:你也可以把内在list理解写成[None if None in col else sum(col)],但我更喜欢把“正常”的情况放在首位。

您也可以转换col为 a set,它允许恒定时间查找,但实际转换为 aset是线性时间,并且由于我们只对每一列进行一次迭代,我认为它不会更快。


推荐阅读