如何从特定元素获取矩阵/网格的左对角元素?

时间:2019-02-27 19:47:44

标签: python list matrix grid diagonal

我有一个不同数字的8x8网格,我想获取包含给定起始位置的对角线元素。这是一个例子

l = [[str(randint(1,9)) for i in range(8)] for n in range(8)]

>> [
[1 5 2 8 6 9 6 8]
[2 2 2 2 8 2 2 1]
[9 5 9 6 8 2 7 2]
[2 8 8 6 4 1 8 1]
[2 5 5 5 4 4 7 9]
[3 9 8 8 9 4 1 1]
[8 9 2 4 2 8 4 3]
[4 4 7 8 7 5 3 6]
]

我该如何从位置x = 4和y = 3(所以列表中的第4个列表和第5个元素)获得对角线?所以我想要的对角线是[8,2,2,4,5,8,9,4]。

我昨天本质上问了这个问题,用户可以通过以下代码帮助我正确对角线:

def rdiagonal(m, x, y):
   #x
   row = max((y - x, 0))
   #y
   col = max((x - y, 0))
   while row < len(m) and col < len(m[row]):
       yield m[row][col]
       row += 1
       col += 1

我试图更改该代码以也获得左对角线,但无法弄清楚。我需要做些什么改变才能使对角线?

3 个答案:

答案 0 :(得分:1)

首先,请注意,在对角线i=j中,rowcol不需要两个变量,因为它们在主对角线。

对于左侧,请注意,在这种情况下,j=l-i,其中l=length(arr)是行的长度。因此,以下代码将执行以下操作:

def leftdiagonal(arr):
    k =[]
    dim = len(arr)-1
    for i in range(dim+1):
            k.append(arr[i][dim-i])
    return(k)

答案 1 :(得分:0)

如果您像在2D平面上的图形那样思考它。行是y,列是x。但是,Python对行索引的定义向下增加,因此将“ y”翻转。这意味着原点在左上角,“ y”随着其下降而增加。

这意味着两件事:

  1. 您可以翻转列表中的行,并可以使用已有的功能
  2. 或者您可以构建新功能而无需触摸列表。逻辑在下面。

'y'被翻转意味着您想要的对角线本质上是以下函数

y = c - x

找到c将使您能够找到对角线。当然,

c = x + y

因此要找到最右边的col或具有最大索引的col,

rightmost_row = min(len(m)-1, c)

要找到最低的行,请观察

x = c - y

所以

lowest_row = c - rightmost_row 

然后,您可以从右上方导航到左下方。您当前的代码从左上角移到右下角。


下面的代码使您对角线。

def ldiagonal(m, x, y):
    #c
    c = x + y
    #x
    col = min((c, len(m)-1))
    #y
    row = c - col
    while col >= 0 and row < len(m[row]):
        yield m[row][col]
        col -= 1
        row += 1

希望这些可以帮助您入门。

答案 2 :(得分:0)

从任何地方开始:

def ldiagonal(m, x, y):
  while y >= 0 and x < len(m):
     yield m[x][y]
     x += 1
     y -= 1

print(list(ldiagonal(m, 0, 0))) #=> [1]
print(list(ldiagonal(m, 0, 7))) #=> [8, 2, 2, 4, 5, 8, 9, 4] # it's the main
print(list(ldiagonal(m, 4, 4))) #=> [4, 8, 2, 4]
print(list(ldiagonal(m, 7, 7))) #=> [6]