python-3.x 有没有一种方法可以使用一个for循环来索引列表矩阵?

eivgtgni  于 2023-01-10  发布在  Python
关注(0)|答案(2)|浏览(126)

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

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循环来重现这个解决方案,任何其他的改进也是受欢迎的。

sr4lhrrt

sr4lhrrt1#

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

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

vngu2lb82#

通过简单地迭代可能的行索引并使用它们来计算行索引和列索引以索引(平方)输入数据,可以在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))

相关问题