需求:把一個二維數組順時針旋轉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])
