我有一个不同数字的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
我试图更改该代码以也获得左对角线,但无法弄清楚。我需要做些什么改变才能使左对角线?
答案 0 :(得分: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)
答案 1 :(得分:0)
如果您像在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
希望这些可以帮助您入门。
答案 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]