python顺时针旋转_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])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值