Python 的对角线差异

Diagonal difference in Python

我正在处理一个 HackerRank 问题,但我不明白其中的一些逻辑:

if (i == j):
    left += a[i][j]

以上是说如果 row/column 索引相同([1,1]、[2,2]、[3,3]),将在这些坐标处找到的值追加到列表 'left'

我不明白下面代码中的逻辑。对我来说,它看起来像是在说在行索引 + 列索引 = 3 (n-1) 的坐标处找到附加值,但我认为这是不对的。下面的代码会翻译成什么?

if (i + j) == (n - 1):
    right += a[i][j]

下面是示例输入 a 和 n 的函数。

a = [[ 1, 2, 3, 4 ],
     [ 5, 6, 7, 8 ],
     [ 1, 2, 3, 4 ],
     [ 5, 6, 7, 9 ]]

n = 4
def xsum(a, n):
    left = 0
    right = 0
    for i in range(0, n):
        for j in range(0, n):
            if (i == j):
                left += a[i][j]
            if (i + j) == (n - 1):
                right += a[i][j]
    return (abs(left-right))

这看起来很糟糕,好像工作太辛苦了。

如果我们要计算“左”对角线。

a = [[ 1, 2, 3, 4 ],
     [ 5, 6, 7, 8 ],
     [ 1, 2, 3, 4 ],
     [ 5, 6, 7, 9 ]]

left = []
for i in range(0, 4):
    left.append(a[i][i])

或者:

left = [a[i][i] for i in range(0, 4)]

找到“正确的”对角线。

right = [a[i][3 - i] for i in range(0, 4)]

如果我们需要查看这如何生成一组索引以索引到 a,我们可以使用以下内容:

>>> [(i, 3 - i) for i in range(0, 4)]
[(0, 3), (1, 2), (2, 1), (3, 0)]

产生:[4, 7, 2, 5]。如果你需要它反转。

right = [a[3 - i][i] for i in range(0, 4)]

这会产生:[5, 2, 7, 4]

如果我们需要左对角线的和,我们只需要使用sum函数:left_sum = sum(left)

我专门为 4x4 矩阵编写了这些示例。将其推广到更大或更小的矩阵应该很简单。

What would the code below translate to?

当且仅当行和列索引之和为 n - 1 时,该代码利用了一个元素位于右对角线上的事实。然后它将给定 (i, j) 对的值添加到 right.

这可以使用以下矩阵进行可视化:每个条目都是其行索引和列索引的总和:

print([[i + j for i in range(4)] for j in range(4)])
#[[0, 1, 2, 3],
# [1, 2, 3, 4],
# [2, 3, 4, 5], 
# [3, 4, 5, 6]]
# (notice that the n - 1 == 3, and the 3s are only on the antidiagonal!)

这是一个关于正确性的问题,与效率是有区别的。如果您想知道这段代码是否有效,答案是否定的:请参阅 Chris 的回答。