python 实现矩阵按对角线打印

 更新时间:2019年11月29日 09:26:19   作者:iamaline  
今天小编就为大家分享一篇python 实现矩阵按对角线打印,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

如下所示:

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]]

思路: 考虑每条对角线开头元素的index(i,j)。i从0开始遍历,j从col-1开始遍历,首先考虑j的变化,若j变为0,则保持不变,让i变化。在确定开头元素后,可通过设置i+1,j+1及不超过范围来向lst中对角线上添加元素。

对于以上例子,各对角线开头元素的index分别为:

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

其中各lst中的元素index分别为:

[(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)开始向左打印:

思路: 同样考虑每条对角线开头元素的index(i,j)。i从0开始遍历,j也从0开始遍历,首先考虑j的变化,若j变为col-1,则保持不变,让i变化。在找到开头元素后,可通过设置i+1,j-1及不超过范围来向lst中对角线上添加元素。

对于以上例子,各对角线开头元素的index分别为:

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

其中各lst中的元素index分别为:

[(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列表相关知识点

    关于python列表相关知识点

    这篇文章主要介绍了关于python列表相关知识点,变量可以存储一个元素,而列表是一个大容器,可以存储N多个元素,程序可以方便的对这些数据进行整体操作,需要的朋友可以参考下
    2023-04-04
  • pygame实现弹力球及其变速效果

    pygame实现弹力球及其变速效果

    这篇文章主要为大家详细介绍了pygame实现弹力球及其变速效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Python 查看数据类型与格式

    Python 查看数据类型与格式

    这篇文章主要介绍了Python 查看数据类型与格式方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Django框架下静态模板的继承操作示例

    Django框架下静态模板的继承操作示例

    这篇文章主要介绍了Django框架下静态模板的继承操作,结合实例形式分析了Django框架模板继承操作的相关原理与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Python实战之ATM取款机的实现

    Python实战之ATM取款机的实现

    这篇文章主要为大家详细介绍了如何利用Python语言模拟实现ATM取款机功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • python 爬取英雄联盟皮肤图片

    python 爬取英雄联盟皮肤图片

    还记得那些年一起网吧开黑通宵的日子吗?《英雄联盟》绝对是大学时期的风靡游戏,即使毕业多年的大学同学相聚,难免不怀念一番当时一起玩《英雄联盟》的日子。今天就给大家分享一下英雄及皮肤图片的爬虫。
    2021-05-05
  • 用Python监控NASA TV直播画面的实现步骤

    用Python监控NASA TV直播画面的实现步骤

    本文分享一个名为"Spacestills"的开源程序,它可以用于查看 NASA TV 的直播画面(静止帧)
    2021-05-05
  • python+tkinter实现学生管理系统

    python+tkinter实现学生管理系统

    这篇文章主要为大家详细介绍了python+tkinter实现学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Python多线程应用于自动化测试操作示例

    Python多线程应用于自动化测试操作示例

    这篇文章主要介绍了Python多线程应用于自动化测试操作,结合实例形式分析了Python多线程基于Selenium进行自动化操作相关实现技巧,需要的朋友可以参考下
    2018-12-12
  • Python实现将多张图片合成视频并加入背景音乐

    Python实现将多张图片合成视频并加入背景音乐

    这篇文章主要为大家介绍了如何利用Python实现将多张图片合成mp4视频,并加入背景音乐。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-04-04

最新评论