Как получить весь диагональный двумерный список без использования numpy? - PullRequest
1 голос
/ 05 мая 2019

У нас есть: a = [[1, 2, 4], [-1, 3, 4], [9, -3, 7]]

Диагональный обход в виде списка: [1, -1, 2, 9, 3, 4]

n = int(input())
a = [[0]*n for _ in range(n)]
for i in range(n):
    a[i] = [int(j) for j in input().strip().split(" ")]

res = []
for j in range(n):
    for k in range(j + 1):
        res.append(a[j - k][k])
print(res)

Как мне получить оставшиеся две диагонали? Мне нужно получить: [-3, 4, 7]

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Попробуй это.Определите переменные COL и ROW и затем запустите следующую функцию с вашей матрицей.

def diagonalOrder(matrix) :       
    # There will be ROW+COL-1 lines in the output   
    for line in range(1, (ROW + COL)) :   
        # Get column index of the first element  
        # in this line of output. The index is 0   
        # for first ROW lines and line - ROW for   
        # remaining lines    
        start_col = max(0, line - ROW) 

        # Get count of elements in this line. 
        # The count of elements is equal to  
        # minimum of line number, COL-start_col and ROW     
        count = min(line, (COL - start_col), ROW) 

        # Print elements of this line     
        for j in range(0, count) :   
            print(matrix[min(ROW, line) - j - 1]   
                        [start_col + j], end = "\t")   
        print() 
0 голосов
/ 05 мая 2019

Сначала просмотрите эту матрицу 3x3, где каждый элемент содержит свою строку в первой цифре и столбец во второй цифре.

00  01  02
10  11  12
20  21  22

Элементы, которые вы хотите, расположены в следующем порядке:

00  10  01  20  11  02  21  12  22

Или с другой точки зрения:

00
10 01
20 11 02
21 12
22

Вы можете видеть, что в первом столбце чисел, приведенных выше, первые цифры 01222.Это представляет range(3) + [2, 2].Теперь посмотрим на вторые цифры первого столбца.Они равны 00012 и представляют [0, 0] + range(3).

Также обратите внимание, что в каждой строке каждый элемент уменьшает свою первую цифру и увеличивает свою вторую цифру до тех пор, пока элемент не станет равным своему обратному.Вы можете увидеть это более четко в третьем ряду.Он начинается в 20, идет в 11 и заканчивается в 02, который является обратным к 20, начальному числу.

Итак, вы можете сделать что-то вроде:

def toNumber(i, j):
    return int(str(i) + str(j))

res = []
a = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]

list1 = list(range(3)) + [2]*2
list2 = [0]*2 + list(range(3))

for i, j in zip(list1, list2):
    inverse = int(str(toNumber(i, j))[::-1])
    while True:
        res.append(a[i][j])
        if toNumber(i, j) == inverse:
            break
        i -= 1
        j += 1

print(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...