我有一个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
我试图更改该代码以获得左对角线,但无法弄明白。获得左对角线需要做出哪些改变?
首先,请注意在右对角线i=j
,所以你不需要row
和col
的两个变量,因为它们在主对角线上总是相等的。
对于左边的那个,注意在这种情况下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)
如果你把它想象成2D平面上的图形。行是y
,列是x
。但是,行索引的python定义向下增加,因此'y'被翻转。这意味着原点位于左上角,“y”随着下降而增加。
这意味着两件事:
'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
希望这些可以帮助你入门。
从任何一点开始:
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]