【问题标题】:Adding None Value Always gives 0添加无值总是给出 0
【发布时间】:2019-05-25 00:16:09
【问题描述】:

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

我尝试了以下代码。

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

【问题讨论】:

    标签: python for-loop multidimensional-array


    【解决方案1】:

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

    现在,我们这里的基本上是listslist,其中每个内部list 代表一行,但我们想要获取每列的总和,并附加限制它应该是@987654326 @ 只要它包含至少一个 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 是线性时间,并且由于我们只对每一列进行一次迭代,因此我不会认为它会更快。

    【讨论】:

      【解决方案2】:

      当 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
      

      【讨论】:

        猜你喜欢
        • 2022-06-28
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多