zoukankan      html  css  js  c++  java
  • Python之二维数组N*N顺时针旋转90度

    需求:把一个二维数组顺时针旋转90度,现实数据的替换。

      比如把4*4的二维数组顺时针旋转90度

      原始数据是一个嵌套列表:[['A', 'B', 'C', 'D'], ['A', 'B', 'C', 'D'], ['A', 'B', 'C', 'D'], ['A', 'B', 'C', 'D']]

      更直观打印显示如下:

    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    转换成下面的数组
    ['A', 'A', 'A', 'A']
    ['B', 'B', 'B', 'B']
    ['C', 'C', 'C', 'C']
    ['D', 'D', 'D', 'D']


    1、思路

      在N*N维数组中,对角线的数据转换前后不变。需要转换次数为 N-1 次。

     

     

    2、源码实现

    • python3.5版本
    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    # Version:Python3.5.0
    # At 2016/2/5 23:01
    '''
    列如把4*4的二维数组顺时针旋转90度
    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    转换成下面的数组
    ['A', 'A', 'A', 'A']
    ['B', 'B', 'B', 'B']
    ['C', 'C', 'C', 'C']
    ['D', 'D', 'D', 'D']
    '''
    import string
    
    def get_number():
        '''
        获取一个N维的数字
        :return: n
        '''
        while True:
            n = 0
            number = input('33[32;1m请输入N维数组: 33[0m').strip()     # 获取一个N的数字
            if number == '':
                continue
            if number.isdigit():
                n = int(number)
                if n > 0 and n <= 26:
                    break
                else:
                    print('33[31;1m输入的N数字超出范围,请重新输入!33[0m')
                    continue
            else:
                print('33[31;1m输入的N有误,请重新输入!33[0m')
                continue
        return n
    
    def rotating(data, n):
        for r in range(n):
            if r == n -1 :  # 最后一个数字不用转换,直接退出循环
                break
            for c in range(r+1,n):
                data[r][c], data[c][r] = data[c][r], data[r][c]
            print('
    第%s次转换后的数据结果' % (r+1))
            for i in range(n):
                print(data[i])
        return data
    
    if __name__ == '__main__':
        n = get_number()    # 返回一个n
        print('顺时针旋转90度 33[31;1m%s33[0m 维数组' % n)
        # 获取n个大写字母
        rotate_str = string.ascii_uppercase[:n]
        data = [[row for row in rotate_str] for col in rotate_str]
        print('开始转换之前的数据')
        for i in range(n):
            print(data[i])
    
        rotating(data, n)   # 调用函数
    
        print('
    最终转换后得到的数据')
        for i in range(n):
            print(data[i])
    

     

    • python2.7版本

      

    
    
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Version:Python2.7.10
    # At 2016/2/5 23:01
    '''
    列如把4*4的二维数组顺时针旋转90度
    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    ['A', 'B', 'C', 'D']
    转换成下面的数组
    ['A', 'A', 'A', 'A']
    ['B', 'B', 'B', 'B']
    ['C', 'C', 'C', 'C']
    ['D', 'D', 'D', 'D']
    '''
    import string
    
    def get_number():
        '''
        获取一个N维的数字
        :return: n
        '''
        while True:
            n = 0
            number = raw_input(u'33[32;1m请输入N维数组: 33[0m').strip()     # 获取一个N的数字
            if number == '':
                continue
            if number.isdigit():
                n = int(number)
                if n > 0 and n <= 26:
                    break
                else:
                    print(u'33[31;1m输入的N数字超出范围,请重新输入!33[0m')
                    continue
            else:
                print(u'33[31;1m输入的N有误,请重新输入!33[0m')
                continue
        return n
    
    def rotating(data, n):
        for r in range(n):
            if r == n -1 :  # 最后一个数字不用转换,直接退出循环
                break
            for c in range(r+1,n):
                data[r][c], data[c][r] = data[c][r], data[r][c]
            print(u'
    第%s次转换后的数据结果' % (r+1))
            for i in range(n):
                print(data[i])
        return data
    
    if __name__ == '__main__':
        n = get_number()    # 返回一个n
        print(u'顺时针旋转90度 33[31;1m%s33[0m 维数组' % n)
        # 获取n个大写字母
        rotate_str = string.ascii_uppercase[:n]
        data = [[row for row in rotate_str] for col in rotate_str]
        print(u'开始转换之前的数据')
        for i in range(n):
            print(data[i])
    
        rotating(data, n)   # 调用函数
    
        print(u'
    最终转换后得到的数据')
        for i in range(n):
            print(data[i])
    
    
    

      

     

     

  • 相关阅读:
    就打排序算法总结
    php 垃圾回收机制写时复制和引用计数
    zend studio 使用断点调试
    SiteServer 迁移至 Windows 2008 R2 问题汇总
    [项目改造中的点滴]C#中IDataReader和DataSet的区别与使用场景
    顺序分支知识总结
    我的第一篇博客
    [原创]删除GRUB引导恢复Windows引导,不用下载任何工具
    在C++builder中使用正则表达式,非boost库,简单!~
    SQL 存储过程优化经验
  • 原文地址:https://www.cnblogs.com/suke99/p/5183993.html
Copyright © 2011-2022 走看看