Как получить левые диагональные элементы матрицы / сетки от определенного элемента? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть сетка 8х8 с разными числами, и я хочу получить элементы диагонали, которые содержат данную начальную позицию.Вот пример

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 голосов
/ 27 февраля 2019

Чтобы начать с любой точки:

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]
0 голосов
/ 27 февраля 2019

Прежде всего, обратите внимание, что в правой диагонали 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)
0 голосов
/ 27 февраля 2019

Если вы думаете об этом как о графике на 2D плоскости.Строка - это y, а столбец - x.Тем не менее, определение Python индекса строки увеличивается вниз, поэтому «y» переворачивается.Это означает, что начало координат находится в верхнем левом углу, и значение y увеличивается по мере его понижения.

Это означает 2 вещи:

  1. Вы можете перевернуть строки своего списка и использовать уже имеющуюся функцию
  2. Или вы можете создать новую функциюне касаясь списка.Логика приведена ниже.

'y' при переворачивании означает, что нужная вам диагональ - это, по сути, следующая функция

y = c - x

. А поиск c позволит вам найти диагональ.Естественно,

c = x + y

Итак, чтобы найти самый правый столбец или столбец с наибольшим индексом,

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

Надеюсь, что это поможет вам начать.

...