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