【问题标题】:Is there a way to index a list matrix using a single for loop?有没有办法使用单个 for 循环来索引列表矩阵?
【发布时间】:2019-05-20 04:04:44
【问题描述】:

我有一个问题,涉及以列表形式获取方阵并找到主对角线和辅助对角线之间差异的绝对值。例如,给定以下列表:

test_matrix = [[11, 2, 4], [4, 5, 6], [10, 8, -12]]

正确的解决方案返回

15

我的解决方案是:

def diagonalDifference(test_matrix):
    primary_diag = 0
    secondary_diag = 0

    for i, row in enumerate(test_matrix):
        for j, val in enumerate(row):
            if (i == j) and ((i + j) == len(test_matrix) - 1):
                secondary_diag += val
                primary_diag += val
            elif i == j:
                primary_diag += val
            elif (i + j) == len(test_matrix) - 1:
                print('secondary_diag:' + str(val))
                secondary_diag += val

    return abs(primary_diag - secondary_diag)

效果很好,但我希望有人能告诉我是否有一种方法可以仅使用一个 for 循环来重现解决方案。也欢迎任何其他可以进行的改进。

【问题讨论】:

    标签: python-3.x list for-loop matrix


    【解决方案1】:

    既然你已经有了一个核心的 Python 解决方案,让我提供一个基于 numpy 的解决方案,它对于大型矩阵可能会更快:

    import numpy as np
    arr = np.array(test_matrix)
    np.abs((np.diag(arr) - np.diag(np.fliplr(arr))).sum())
    

    【讨论】:

      【解决方案2】:

      是的!确实有可能不仅用一个循环解决这个问题,而且实际上在 O(n) 中:

      def diagonalDifference(test_matrix):
          diff = 0
      
          for i in range(len(test_matrix)):
              diff += test_matrix[i][i]
              diff -= test_matrix[i][-i-1]
      
          return abs(diff)
      
      test_matrix = [[11, 2, 4], [4, 5, 6], [10, 8, -12]]
      print(diagonalDifference(test_matrix))
      

      欢迎做 SE!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-04
        • 2020-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        相关资源
        最近更新 更多