添加无值始终给出0

时间:2019-05-25 00:16:09

标签: python for-loop multidimensional-array

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

我尝试了以下代码。

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

2 个答案:

答案 0 :(得分:0)

当matrix [i] [j] == None时,您不需要存储在缓冲区None中,因为在退出内循环时要更改vektor的值,所以 vektor始终取值缓冲区

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:
            buffer = None
            break
    vektor[j][0] = buffer 
return vektor

答案 1 :(得分:0)

正如我经常说的,您应该将矩阵(一种数学抽象)与它的实现list中的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转换为set,这允许进行恒定时间查找,但是实际转换为set的时间是线性时间,因为我们只遍历每列一次,我认为不会更快。