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('\033[32;1m请输入N维数组: \033[0m').strip()     # 获取一个N的数字
        if number == '':
            continue
        if number.isdigit():
            n = int(number)
            if n > 0 and n <= 26:
                break
            else:
                print('\033[31;1m输入的N数字超出范围,请重新输入!\033[0m')
                continue
        else:
            print('\033[31;1m输入的N有误,请重新输入!\033[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('\n第%s次转换后的数据结果' % (r+1))
        for i in range(n):
            print(data[i])
    return data

if __name__ == '__main__':
    n = get_number()    # 返回一个n
    print('顺时针旋转90度 \033[31;1m%s\033[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('\n最终转换后得到的数据')
    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'\033[32;1m请输入N维数组: \033[0m').strip()     # 获取一个N的数字
        if number == '':
            continue
        if number.isdigit():
            n = int(number)
            if n > 0 and n <= 26:
                break
            else:
                print(u'\033[31;1m输入的N数字超出范围,请重新输入!\033[0m')
                continue
        else:
            print(u'\033[31;1m输入的N有误,请重新输入!\033[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'\n第%s次转换后的数据结果' % (r+1))
        for i in range(n):
            print(data[i])
    return data

if __name__ == '__main__':
    n = get_number()    # 返回一个n
    print(u'顺时针旋转90度 \033[31;1m%s\033[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'\n最终转换后得到的数据')
    for i in range(n):
        print(data[i])

  

 

 

 

posted @ 2016-02-06 12:29  suke99  阅读(4233)  评论(1编辑  收藏  举报