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

  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM