Как получить диагональные элементы матрицы / сетки из определенного элемента? - PullRequest
0 голосов
/ 26 февраля 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-й элемент в этом списке)?Так что диагональ, которую я хотел бы, была бы [5,2,6,4,4,1,3].

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Вы можете вычислить строку и столбец верхнего левого элемента диагонали на основе разности x и y, а также числа итераций на основе разницы между нижней из двух границ ивыше начальной строки и столбца:

def diagonal(m, x, y):
    row = max((y - x, 0))
    col = max((x - y, 0))
    for i in range(min((len(m), len(m[0]))) - max((row, col))):
        yield m[row + i][col + i]

, поэтому:

m = [
    [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],
]
print(list(diagonal(m, 4, 3)))

выводит:

[5, 2, 6, 4, 4, 1, 3]
0 голосов
/ 26 февраля 2019

Мне кажется нелогичным использовать «y» вдоль ряда и «x» вдоль вертикали, поэтому я поменял их местами.Если у вас все в порядке с началом индексации с нуля, у меня это сработало:

from random import randint

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

# Show the grid
for row in l:
    print(' '.join([str(n) for n in row]))

# Give the initial position, then follow the diagonal down and
# to the right until you run out of rows or columns.
x_pos = 1 
y_pos = 3
diag = []
while x_pos < len(l[0]) and y_pos < len(l):
    diag.append(l[y_pos][x_pos])
    x_pos += 1
    y_pos += 1

print(diag)

Пример вывода:

1 3 8 7 3 1 5 2
4 5 8 6 9 4 3 2
2 6 1 3 8 6 8 1
7 1 8 2 7 4 7 4
9 5 5 5 5 2 3 1
8 5 9 7 2 7 1 8
3 3 3 4 2 9 8 3
3 2 8 6 2 4 4 8
['1', '5', '7', '2', '4']
0 голосов
/ 26 февраля 2019

Вот что я придумал.Это не красиво, но оно выполняет свою работу.

def get_diagonal(full_grid, y, x):
    if x > y:
        while y >= 1:
            x -= 1
            y -= 1
    else:
        while x >= 1:
            x -= 1
            y -= 1
    diagonal = []
    while x < len(grid) and y < len(grid[0]):
        diagonal.append(grid[x][y])
        x += 1
        y += 1
    return diagonal

grid = [
    [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]]

get_diagonal(grid, 5, 3)
...