Python 中的对角线差异

问题描述 投票:0回答:4

我正在研究 HackerRank 问题,但我不明白其中的一些逻辑:

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

上面的意思是如果行/列索引相同([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))
python diagonal
4个回答
3
投票

这看起来太辛苦了。

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

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 矩阵编写了这些示例。对于更大或更小的矩阵应该很容易推广这一点。


2
投票

下面的代码会翻译成什么?

该代码利用了这样一个事实:当且仅当行索引和列索引之和为

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 的回答。


1
投票
def diagonalDifference(arr):

    mat = len(arr[0]) #type of matrix e.g(3by3)
    left_sum = 0
    right_sum =0
    k =mat-1 #rightmost element accessor 

    for i in range(mat):
        left_sum += arr[i][i] 

    for j in range(mat):
        right_sum += arr[j][k]
        k-=1

    return abs(right_sum - left_sum)

0
投票
def diagonalDifference(arr):
    n = len(arr)
    left_to_right = 0
    right_to_left = 0
    for i in range(n):
        left_to_right += arr[i][i]
        right_to_left += arr[i][n - (i + 1)]
    return abs(left_to_right - right_to_left)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.