【问题标题】:How to get all the diagonal two-dimensional list without using numpy?如何在不使用 numpy 的情况下获取所有对角线二维列表?
【发布时间】:2019-05-05 21:37:38
【问题描述】:

我们有: 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]

【问题讨论】:

  • 3x3 矩阵的主对角线有 3 个元素。侧对角线的元素较少。您的示例有 6 个元素。为什么?
  • 在您的示例中,对角线为 [1, 3, 7]。
  • @MartinThoma 我的示例包含一个列表,其中前三个对角线。
  • @MartinThoma 这是一条对角线

标签: python list


【解决方案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() 

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2016-03-01
      • 2018-10-02
      • 1970-01-01
      • 2011-05-25
      • 2020-06-25
      相关资源
      最近更新 更多