Python实现矩阵对角线打印:从右上到左下的两种遍历策略

一颗松果
一颗松果
发布时间:2026-10-13 | 3人浏览过
原创

本文详细解析如何使用Python将二维矩阵按对角线方向打印。重点介绍两种核心思路:一是从右上角开始向左下方向遍历,二是从左上角开始向右下方向遍历。通过定义对角线起始坐标并控制边界条件,利用双重循环与while循环结合的方式,完整保留矩阵元素顺序。代码包含完整测试用例,适用于面试手撕代码及日常数据处理场景。

矩阵对角线打印概述

具体效果如下所示:


Description:
将一个矩阵(二维数组)按对角线向右进行打印。(搜了一下发现好像是美团某次面试要求半小时手撕的题)
Example:
Input:
[
[1,2,3,4],
[5,1,2,3],
[9,5,1,2]
]
Output:
[[4],
[3, 3],
[2, 2, 2],
[1, 1, 1],
[5, 5],
[9]]

从右上角向左下遍历

核心思路在于确定每条对角线的起始元素坐标 (i, j)。遍历过程中,i 从 0 开始递增,j 则从列数减 1(即 col-1)开始递减。优先调整 j 的值,当 j 减小至 0 时,固定 j 为 0,转而让 i 递增。在确定起始点后,通过同时增加 i 和 j(即 i+1, j+1)并限制在矩阵范围内,依次将对角线上的元素加入列表。

针对上述示例,各条对角线的起始元素坐标分别为:


(0,3)
(0,2)
(0,1)
(0,0)
(1,0)
(2,0)

对应各列表中的元素坐标分布如下:


[(0,3)]
[(0,2),(1,3)]
[(0,1),(1,2),(2,3)]
[(0,0),(1,1),(2,2)]
[(1,0),(2,1)]
[(2,0)]

参考代码如下:


def diagonal_right(matrix):
 if not matrix:
  return []
 row = len(matrix)
 col = len(matrix[0])
 col2 = col
 result = []
 for i in range(row):
  for j in range(col2 - 1, -1, -1): #j倒序遍历
   lst = []
   i1,j1 = i,j #i1,j1用于方便同一对角线元素的添加,否则改变i,j影响开头元素的选择
   while i1 <= row - 1 and j1 <= col - 1:
    lst.append(matrix[i1][j1])
    j1 += 1
    i1 += 1
   result.append(lst)
   if i == 0 and j == 0:#当遍历完(0,0)开头的一条对角线后,让j固定为0
    col2 = 1
 return('the result is: %s'%result,'end')
 
#test
print(diagonal_right([[1],[2]]))
print(diagonal_right([[1]]))
print(diagonal_right([
 [1,2,3,4],
 [5,1,2,3],
 [9,5,1,2]
]))

运行结果如下:

从左上角向左下遍历

变体实现:改为从左上角 (0,0) 开始向左下方向打印:

思路分析:同样需要确定每条对角线的起始坐标 (i, j)。此时 i 从 0 开始遍历,j 也从 0 开始遍历,优先调整 j 的值。当 j 增加至列数减 1(即 col-1)时,固定 j 为 col-1,转而让 i 递增。找到起始点后,通过 i 递增且 j 递减(即 i+1, j-1)并限制在矩阵范围内,依次将对角线上的元素加入列表。

针对上述示例,各条对角线的起始元素坐标分别为:


(0,0)
(0,1)
(0,2)
(0,3)
(1,3)
(2,3)

对应各列表中的元素坐标分布如下:


[(0,0)]
[(0,1),(1,0)]
[(0,2),(1,1),(2,0)]
[(0,3),(1,2),(2,1)]
[(1,3),(2,2)]
[(2,3)]

参考代码如下:


def diagonal_left(matrix):
 if not matrix:
  return []
 row = len(matrix)
 col = len(matrix[0])
 k=0
 result = []
 for i in range(row):
  for j in range(k,col): # j顺序遍历
   lst = []
   i1, j1 = i, j # i1,j1用于方便同一对角线元素的添加,否则改变i,j影响开头元素的选择
   while i1 <= row - 1 and j1 >=0:
    lst.append(matrix[i1][j1])
    j1 -= 1
    i1 += 1
   if i==0 and j==col-1:
    k=col-1
   result.append(lst)
 return ('the result is: %s' % result, 'end')

# test
print(diagonal_left([[1],[2]]))
print(diagonal_left([[1]]))
print(diagonal_left([
 [1,2,3,4],
 [5,1,2,3],
 [9,5,1,2]
]))

运行结果如下:

该问题还存在多种变体,例如从左下角或右下角开始按对角线打印,只需对起始坐标和遍历方向进行简单调整即可实现。

以上即为Python实现矩阵按对角线打印的完整内容,希望能为读者提供参考与帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表