Python使用迭代器打印螺旋矩阵的思路及代码示例

 更新时间:2016年07月02日 12:02:13   投稿:goldensun  
用Python的itertools模块来创建具有迭代功能的函数十分具有技巧性,这里我们就来看一下借助itertools模块、Python使用迭代器打印螺旋矩阵的思路及代码示例

思路

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,
向左变大,向上变大,如此循环。
螺旋矩阵用二维数组表示,坐标(x,y),即(x轴坐标,y轴坐标)。
顺时针螺旋的方向是->右,下,左,上,用数值表示即是x加1格(1,0),y加1格(0,1),x减1格(-1,0),y减1格(0,-1)。
坐标从(0,0)开始行走,当超出范围或遇到障碍时切换方向。
螺旋矩阵的打印首先要对n*n的数组进行赋值,根据规律可以看出,每一层都是按照右->下->左->上的顺序进行递增,因此,只要找出每一层的第一个数即可,第一个数值为上一层的第一个数+4*n-4,循环时n每次减2。

代码
经过上面的分析,思路很清晰了,千言不如一码:

import itertools 
def spiral(n,m): 
  _status = itertools.cycle(['right','down','left','up'])#用于状态周期性的切换 
  _movemap = { 
    'right':(1,0), 
    'down':(0,1), 
    'left':(-1,0), 
    'up':(0,-1), 
  } 
  pos2no = dict.fromkeys([(x,y) for x in range(n) for y in range(m)]) 
  _pos = (0,0) 
  _st = next(_status) 
  for i in range(1,n*m+1): 
    _oldpos = _pos 
    _pos = tuple(map(sum,zip(_pos,_movemap[_st])))#根据状态进行移动 
    if (_pos not in pos2no) or (pos2no[_pos]):#当超出范围或遇到障碍时切换方向 
      _st = next(_status) 
      _pos = tuple(map(sum,zip(_oldpos,_movemap[_st]))) 
    pos2no[_oldpos] = i 
  return pos2no 
 
def display_spiral(n,m): 
  pos2no = spiral(n,m) 
  for i in range(m): 
    for j in range(n): 
      print pos2no[(j,i)],'\t', 
    print '\n' 
  print '-'*30 
 
display_spiral(4,4) 
display_spiral(5,4) 

201672115457986.jpg (282×289)

相关文章

  • Python将list中的string批量转化成int/float的方法

    Python将list中的string批量转化成int/float的方法

    今天小编就为大家分享一篇Python将list中的string批量转化成int/float的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python3.7 的新特性详解

    python3.7 的新特性详解

    这篇文章主要介绍了python3.7 的新特性详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 使用Python第三方库pygame写个贪吃蛇小游戏

    使用Python第三方库pygame写个贪吃蛇小游戏

    这篇文章主要介绍了使用Python第三方库pygame写个贪吃蛇小游戏,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • PyTorch读取Cifar数据集并显示图片的实例讲解

    PyTorch读取Cifar数据集并显示图片的实例讲解

    今天小编就为大家分享一篇PyTorch读取Cifar数据集并显示图片的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 关于pyqt5弹出提示框的详细介绍

    关于pyqt5弹出提示框的详细介绍

    在实际的程序开发中经常会用到各种各样的消息框来给用户一些提示或提醒,下面这篇文章主要给大家介绍了关于pyqt5弹出提示框的详细介绍,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Pycharm社区版创建Flask项目的实现步骤

    Pycharm社区版创建Flask项目的实现步骤

    本文主要介绍了Pycharm社区版创建Flask项目,包括设置Python环境、安装Flask库以及创建基本的项目结构,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • python中使用asyncio实现异步IO实例分析

    python中使用asyncio实现异步IO实例分析

    在本篇文章里小编给大家整理的是一篇关于python中使用asyncio实现异步IO实例分析内容,有兴趣的朋友们可以学习下。
    2021-02-02
  • python返回昨天日期的方法

    python返回昨天日期的方法

    这篇文章主要介绍了python返回昨天日期的方法,涉及Python日期操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Python获取B站粉丝数的示例代码

    Python获取B站粉丝数的示例代码

    这篇文章主要介绍了Python获取B站粉丝数的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Matplotlib直方图绘制中的参数bins和rwidth的实现

    Matplotlib直方图绘制中的参数bins和rwidth的实现

    本文主要介绍了Matplotlib直方图绘制中的参数bins和rwidth的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02

最新评论