1. 程式人生 > >Python 旋轉二維陣列

Python 旋轉二維陣列

故事要從前幾個月刷劍指offer的時候說起,那時候遇到過一個關於二維陣列的問題,問題如下

輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

遇到這個問題我的第一個念頭就是要是可以把二維陣列旋轉一下,然後不斷列印第一行後移除掉就可以了,然後我就去搜集資料,看了一種旋轉方法就被驚豔到了好6的演算法。以下是我的解法

class Solution:
    # matrix型別為二維列表,需要返回列表
def printMatrix(self, matrix): res = [] while matrix: res += matrix[0] matrix.remove(matrix[0]) if matrix: matrix[:] = map(list, zip(*matrix))[::-1] return res

python的特性使得可以在一行之內就完成陣列的旋轉操作。接下來解釋一下是怎麼旋轉的

首先說一下 zip 函式:

a = [[1,2,3],
     [4,5,6],
     [7,8,9]]
zip(*a) # 經過zip的壓縮得到的結果如下 [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

到這裡我們其實就已經明白了這個函式的作用,zip本來就是壓縮,在這裡就是直接將一個二維陣列縱向壓成了一個一維的。
這個時候我們再把其中壓縮後產生的元組轉換回list看看它變成了什麼樣子

map(list,zip(*[[1,2,3],[4,5,6],[7,8,9]]))
# 經過map轉換的list的得到的結果如下
[[1, 4, 7],  
 [2, 5, 8],  
 [3, 6, 9]] 
# 而我們期望得到的矩陣是這樣的
[[7, 4, 1],  
 [8, 5, 2],  
 [9, 6, 3]]
# 他們兩個是左右相反的,到了這裡我們已經明白了原理,將他左右顛倒還不簡單, # 利用python的slice特性[::-1]就可以了唄 matrix[:] = map(list,zip(*a))[::-1]

我們已經知道了原理所以無論是以後遇到順時針或者逆時針旋轉二維陣列,我們一行程式碼都可以玩的轉

相關推薦

Python 旋轉陣列

故事要從前幾個月刷劍指offer的時候說起,那時候遇到過一個關於二維陣列的問題,問題如下 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

python陣列的某行或列排序 (numpy lexsort)

lexsort支援對陣列按指定行或列的順序排序;是間接排序,lexsort不修改原陣列,返回索引。 (對應lexsort 一維陣列的是argsort a.argsort()這麼使用就可以;argsort也不修改原陣列, 返回索引)   預設按最後一行元素有小到大排序, 返回最後

Python陣列的建立

習慣了java的Matrix = [][]不知道python怎麼創二維陣列。 先看 python中的二維陣列操作 對最後提出的二維陣列建立方式存在疑問 Matrix = [([0] * 3) for i in range(4)] 為什麼可以用[0]*3?不會淺拷貝嗎?   看了

基於python陣列的建立

在c++中,陣列的建立就是直接寫入就是num[ ][ ]這種方式,但是python的不同方法之間存在著些許的差異。在python中說是陣列,不如說是二維列表。 首先我想講的是在生成列表中所容易犯的各種錯誤: 1. array = [0,0,0] array1 =

(劍指offer python陣列中的查詢

題目 二維陣列中的查詢 題目描述 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 例如下面的二維陣列就是每行、每列都遞增排序。如果在

Python建立陣列和切片操作

在推薦系統的資料構造時,經常要使用二維陣列,通常先建立元素均為0的陣列,這要使用Numpy模組中的zeros()函式 1.建立一個元素為0的二維陣列: from numpy import * b=zeros((2,3))>> array([[ 0., 0.

python實現陣列

python中沒有陣列,所以只能用列表、或字典實現二維陣列 一、列表實現——初始化二維陣列:建立一個3行4列的二維陣列 (1) 暴力建立 mylist = [[0,0,0], [0,0,0],

python儲存陣列到txt檔案中

一個非常繁瑣粗暴的方法,python屬於入門級水平,就醬先備份一下,如果有更好的方法再更新 arrs=[[2,15,48,4,5],[6,7,6,4,1],[2,3,6,6,7],[4,6,8,11,2]] ARRS = [] f=open('testARRS.txt','

關於python實現陣列所有元素求和

今天遇到一個需求,求二維陣列的和,儘量在一行程式碼中完成: 關於二維陣列求和的幾種方法:    a = [[1,2],[3,4],[5,6]]    1.sum(map(sum,a)) #first, map(func,a) 函式是對a中的每一個元素進行sum操作

python陣列操作

需要在程式中使用二維陣列,網上找到一種這樣的用法:     #建立一個寬度為3,高度為4的陣列#[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0]] myList = [[0] * 3] * 4 但是當操作myList[0][1] = 1

python建立陣列的坑

array = ['!'] * 10 rows = [array] * numRows #二維陣列 但是你會發現更改一個值之後,所有行都被修改!!! 相當於建立了n

Python 2.7 建立陣列

前言: 從java到cobol,一直沒有把陣列的坑填過。 至少現在把python的二維陣列的坑填上~~ 只要開始,都不算晚 二維陣列的建立beginning~ Python中的list、tuple預設都是一維的。 方式一: lst2 = [1, 2, [

陣列(矩陣)順時針旋轉90°

1.先轉置 2.後調換列元素     public void rotate(int[][] matrix){        //矩陣轉置程式碼        &n

python使用Counter實現陣列按列(行)統計元素出現個數

主要是用到了 collections 裡面的Counter函式 import numpy as np from collections import Counter rows=10 cols=9 arr=np.random.random_integers(1,10,(10,9))#

python 陣列讀入

  study from : https://www.cnblogs.com/reaptomorrow-flydream/p/9613847.html python 二維陣列鍵盤輸入1 m = int(input())2 grid = [[] for i in range(m)]3 for i

python 陣列(list)建立的坑

python 二維陣列(二維list)建立的坑 快速建立一維度list ,並修改 >>> l=[0]*3 >>> l [0, 0, 0] >>> l[0]=1 >>> l [1, 0, 0] >>&g

如何使用python來對陣列進行排序

1、複合排序 直接用numpy的lexsort就可以 import numpy as np data = np.array([[1,2,3,4,5], [1,2,3,6,7], [2,3,4,5,7], [3,4,5,6,7], [4,5,6,7,8]]) idex=np.lexsort([-1*d

劍指offer(python): 第一題 陣列 陣列中的查詢

題目描述: 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。   最粗暴的做法,對陣列中的數字一個個遍歷過去。最差情況下的時間複雜

python+numpy按行求一個陣列的最大值

問題描述: 給定一個二維陣列,求每一行的最大值 返回一個列向量 如: 給定陣列【1,2,3;4,5,3】 返回[3;5] import numpy as np x = np.array([[1,2,3],[4,5,3]]) # 先求每行最大值得下標 index

Python之按行讀取DataFrame陣列資料

import numpy as np import pandas as pd data = {"省份":['北京', "上海", "天津", "重慶", "江蘇", "浙江", "廣東"], "年份":[2017, 2015, 2013, 2016, 200