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

问题描述 投票:-1回答:3

我有一个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

我试图更改该代码以获得左对角线,但无法弄明白。获得左对角线需要做出哪些改变?

python list matrix grid diagonal
3个回答
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)

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

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


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]
© www.soinside.com 2019 - 2024. All rights reserved.