如何在不使用numpy的情况下获取所有对角二维列表?

时间:2019-05-05 12:48:55

标签: python list

我们有: 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 个答案:

答案 0 :(得分:1)

尝试一下。定义变量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() 

答案 1 :(得分:0)

首先,查看此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)