获取python 2d列表中2个点之间对角线上的点列表

获取python 2d列表中2个点之间对角线上的点列表,python,math,multidimensional-array,Python,Math,Multidimensional Array,对于给定的二维正方形列表,请说: foo2d = [ [1, 1, 1, 1, 3], [1, 3, 0, 3, 4], [1, 1, 1, 1, 3], [1, 3, 0, 2, 4], [1, 3, 1, 3, 4] ] 我想要一个从(0,1)(foo2d[1][0])到它的点对角线(2,3)(foo2d[3][2])的对角线列表。因此,在上面的玩具列表中,返回的列表应该是:[1,0,1] 我尝试利用该行的斜率为1(或-1)这一事实,因此列表中的元素必须满足: pointY -

对于给定的二维正方形列表,请说:

foo2d = [
[1, 1, 1, 1, 3],
[1, 3, 0, 3, 4],
[1, 1, 1, 1, 3],
[1, 3, 0, 2, 4],
[1, 3, 1, 3, 4]
]
我想要一个从(0,1)(
foo2d[1][0]
)到它的点对角线(2,3)(
foo2d[3][2]
)的对角线列表。因此,在上面的玩具列表中,返回的列表应该是:
[1,0,1]

我尝试利用该行的斜率为1(或-1)这一事实,因此列表中的元素必须满足:

     pointY - startY
abs(-----------------) == 1
     pointX - startX
并且在x最小值和x最大值之间。我没有代码实现,因为a)它破坏了一切,b)我的计算机在保存文件时崩溃,迫使我恢复到不包含该代码的git备份


如果需要,我可以尝试为这种行为编写一些伪代码。谢谢你对这个问题的任何想法

如果直线斜率只能为1或-1,您可以尝试以下方法:

def get_diagonal_points(matrix, start_x, start_y, end_x, end_y):
    # make start_x <= end_x, if you don't need to check, remove this line
    if start_x > end_x:
        start_x, start_y, end_x, end_y = end_x, end_y, start_x, start_y

    result = []
    slope = (end_y - start_y) // (end_x - start_x)
    for i, j in zip(range(start_x, end_x), range(start_y, end_y, slope)):
        result.append(matrix[i][j])
    result.append(matrix[end_x][end_y])  # add end point
    return result

想用numpy吗?@WeNYoBen嗯。。。我不/不/不想为此重组我的计划,而且看起来这可能比它的价值更麻烦。我更喜欢香草蟒蛇,但如果我必须,我必须。你想把所有的点都打印在2点之间的对角线上吗?所以直线的斜率只能是1或-1?或者有什么价值?@recnac想想女王在棋盘上是如何移动的。我觉得自己太笨了,忘了-1,谢谢你的回答。我从来没有真正理解过zip函数的功能是什么?你能解释一下吗?打包迭代器并将它们一起遍历@warpdriveenterprises您可以简单地将其理解为同时进行两次
range
@军工企业
foo2d = [
[1, 1, 1, 1, 3],
[1, 3, 0, 3, 4],
[1, 1, 1, 1, 3],
[1, 3, 0, 2, 4],
[1, 3, 1, 3, 4]
]
print(get_diagonal_points(foo2d, 0, 1, 2, 3))
# [1, 0, 1]
print(get_diagonal_points(foo2d, 0, 4, 3, 1))
# [3, 3, 1, 3]
print(get_diagonal_points(foo2d, 3, 1, 0, 4))
# [3, 3, 1, 3]