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 的回答。
我正在处理一个 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 的回答。