python 实现矩阵按对角线打印


Posted in Python onNovember 29, 2019

如下所示:

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

输出:

python 实现矩阵按对角线打印

变型: 由(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的框架中一些会话程序的管理
Apr 20 Python
python如何通过实例方法名字调用方法
Mar 21 Python
tensorflow 1.0用CNN进行图像分类
Apr 15 Python
python实现泊松图像融合
Jul 26 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
python之列表推导式的用法
Nov 29 #Python
python 实现方阵的对角线遍历示例
Nov 29 #Python
python 实现一个反向单位矩阵示例
Nov 29 #Python
python 实现矩阵填充0的例子
Nov 29 #Python
python循环嵌套的多种使用方法解析
Nov 29 #Python
python写一个随机点名软件的实例
Nov 28 #Python
关于Python-faker的函数效果一览
Nov 28 #Python
You might like
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
js对象数组按属性快速排序
2011/01/31 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
简介alert()与console.log()的不同
2015/08/26 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
python类继承与子类实例初始化用法分析
2015/04/17 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
Selenium的使用详解
2018/10/19 Python
python数字类型math库原理解析
2020/03/02 Python
Python 如何查找特定类型文件
2020/08/17 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
专科应届生求职信
2013/11/24 职场文书
医药销售求职信范文
2014/02/01 职场文书
分公司任命书
2014/06/06 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
患者身份识别制度
2015/08/06 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
Mysql事务索引知识汇总
2022/03/17 MySQL
详解OpenCV曝光融合
2022/04/29 Python