徹底搞懂Python切片操作


寫在前面:

利用python解決問題的過程中,經常會遇到從某個對象中抽取部分值的情況。“切片”操作正是專門用於實現這一目標的有力武器。理論上,只要條件表達式得當,可以通過單次或多次切片操作實現任意目標值切取。切片操作的基本語法比較簡單,但如果不徹底搞清楚內在邏輯,也極容易產生錯誤,而且這種錯誤有時隱蔽得較深,難以察覺。本文通過詳細例子總結歸納了切片操作的各種情形,下文均以list類型作為實驗對象,其結論可推廣至其他可切片對象。

一、 Python可切片對象的索引方式

包括:正索引和負索引兩部分,如下圖所示,以list對象a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]為例:

 

二、 Python切片操作的一般方式

一個完整的切片表達式包含兩個“:”,用於分隔三個參數(start_index、end_index、step)。當只有一個“:”時,默認第三個參數step=1;當一個“:”也沒有時,start_index=end_index,表示切取start_index指定的那個元素。 

step:正負數均可,其絕對值大小決定了切取數據時的‘‘步長”,而正負號決定了“切取方向”,正表示“從左往右”取值,負表示“從右往左”取值。當step省略時,默認為1,即從左往右以步長1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”,重要的事情說三遍!

start_index:表示起始索引(包含該索引對應值);該參數省略時,表示從對象“端點”開始取值,至於是從“起點”還是從“終點”開始,則由step參數的正負決定,step為正從“起點”開始,為負從“終點”開始。

end_index:表示終止索引(不包含該索引對應值);該參數省略時,表示一直取到數據“端點”,至於是到“起點”還是到“終點”,同樣由step參數的正負決定,step為正時直到“終點”,為負時直到“起點”。

三、 Python切片操作詳細例子

以下示例均以list對象a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]為例:

>>>a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

1. 切取單個元素
 
2. 切取完整對象

 

 

3. start_index和end_index全為正(+)索引的情況

  

4. start_index和end_index全為負(-)索引的情況
 
5. start_index和end_index正(+)負(-)混合索引的情況
 
6. 多層切片操作
 
7. 切片操作的三個參數可以用表達式

 

 8. 其他對象的切片操作

前面的切片操作以list對象為例進行說明,但實際上可進行切片操作的數據類型還有很多,包括元組、字符串等等。

 

 四、 常用切片操作

1.取偶數位置

 

 2.取奇數位置

 

 3.拷貝整個對象

 

 需要注意的是:[:]和.copy()都屬於“淺拷貝”,只拷貝最外層元素,內層嵌套元素則通過引用方式共享,而非獨立分配內存,如果需要徹底拷貝則需采用“深拷貝”方式,如下例所示:

 

 4.修改單個元素

 

 5.在某個位置插入元素

 

 6.替換一部分元素

 

 五、 總結

(一)start_index、end_index、step三者可同為正、同為負,或正負混合。但必須遵循一個原則,即:當start_index表示的實際位置在end_index的左邊時,從左往右取值,此時step必須是正數(同樣表示從左往右);當start_index表示的實際位置在end_index的右邊時,表示從右往左取值,此時step必須是負數(同樣表示從右往左),即兩者的取值順序必須相同。

(二)當start_index或end_index省略時,取值的起始索引和終止索引由step的正負來決定,這種情況不會有取值方向矛盾(即不會返回空列表[]),但正和負取到的結果順序是相反的,因為一個向左一個向右。

(三)step的正負是必須要考慮的,尤其是當step省略時。比如a[-1:],很容易就誤認為是從“終點”開始一直取到“起點”,即a[-1:]= [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],但實際上a[-1:]=[9](注意不是9),原因在於step省略時step=1表示從左往右取值,而起始索引start_index=-1本身就是對象的最右邊元素了,再往右已經沒數據了,因此結果只含有9一個元素。

(四)需要注意:“取單個元素(不帶“:”)”時,返回的是對象的某個元素,其類型由元素本身的類型決定,而與母對象無關,如上面的a[0]=0、a[-4]=6,元素0和6都是“數值型”,而母對象a卻是“list”型;“取連續切片(帶“:”)”時,返回結果的類型與母對象相同,哪怕切取的連續切片只包含一個元素,如上面的a[-1:]=[9],返回的是一個只包含元素“9”的list,而非數值型“9”。



作者:馬爾代夫Maldives
鏈接:https://www.jianshu.com/p/15715d6f4dad
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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