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