有没有一种方法可以使用单个for循环索引列表矩阵?

时间:2019-05-20 04:04:45

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

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

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循环来重现该解决方案。也可以进行任何其他改进。

2 个答案:

答案 0 :(得分:0)

是的!实际上,不仅可以通过单个循环来解决问题,而且实际上可以在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!

答案 1 :(得分:0)

由于您已经拥有核心的Python解决方案,因此让我提供一个基于numpy的解决方案,对于大型矩阵,该解决方案可能会更快:

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