搜尋
首頁後端開發Python教學一文徹底搞懂python切片操作

一文徹底搞懂python切片操作

Jul 31, 2019 pm 03:59 PM
python切片操作

一文徹底搞懂python切片操作

在利用Python解決各種實際問題的過程中,經常會遇到從某個物件中抽取部分值的情況,切片操作正是專門用於完成這項操作的有力武器。理論上而言,只要條件表達式得當,可以透過單次或多次切片運算實現任意切取目標值。切片操作的基本語法比較簡單,但如果不徹底搞清楚內在邏輯,也極容易產生錯誤,而且這種錯誤有時隱密得比較深,難以察覺。本文透過詳細例子總結歸納了切片操作的各種情況。若有錯誤和不足之處請大牛指正!

一、Python可切片物件的索引方式

Python可切片物件的索引方式包括:正索引與負索引兩部分。

如下圖所示,以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]為例:

一文徹底搞懂python切片操作

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

一個完整的切片表達式包含兩個“:”,用於分隔三個參數(start_index、end_index、step),當只有一個“:”時,預設第三個參數step=1。

切片操作基本表達式:object[start_index : end_index : step]

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

start_index:表示起始索引(包含該索引本身);此參數省略時,表示從物件「端點」開始取值,至於是從「起點」或從「終點」開始,則由step參數的正負決定,step為正從「起點」開始,為負從「終點」開始。

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

三、Python切片操作詳細範例

以下範例皆以列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8 , 9]為例:

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

1.切取單一值

>>> a[0]
0
>>> a[-4]
6

2.切取完整物件

>>> a[:] # 从左往右
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[::] # 从左往右
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[::-1] # 从右往左
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

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

>>> a[1:6] # step=1,从左往右取值,start_index=1到end_index=6同样表示从左往右取值。
[1, 2, 3, 4, 5]
>>>a[1:6:-1] # step=-1,决定了从右往左取值,而start_index=1到end_index=6决定了从左往右取值,两者矛盾。
>>> [] # 输出为空列表,说明没取到数据。
>>>a[6:1] # step=1,决定了从左往右取值,而start_index=6到end_index=1决定了从右往左取值,两者矛盾。
>>> [] # 同样输出为空列表。
>>>a[:6] # step=1,从左往右取值,从“起点”开始一直取到end_index=6。
>>> [0, 1, 2, 3, 4, 5]
>>>a[:6:-1] # step=-1,从右往左取值,从“终点”开始一直取到end_index=6。
>>> [9, 8, 7]
>>>a[6:] # step=1,从左往右取值,从start_index=6开始,一直取到“终点”。
>>> [6, 7, 8, 9]
>>>a[6::-1] # step=-1,从右往左取值,从start_index=6开始,一直取到“起点”。
>>> [6, 5, 4, 3, 2, 1, 0]

相關推薦:《Python影片教學

#4.start_index和end_index全為負(-)索引的情況

>>>a[-1:-6] # step=1,从左往右取值,而start_index=-1到end_index=-6决定了从右往左取值,两者矛盾。
>>> []
>>>a[-1:-6:-1] # step=-1,从右往左取值,start_index=-1到end_index=-6同样是从右往左取值。
>>> [9, 8, 7, 6, 5]
>>>a[-6:-1] # step=1,从左往右取值,而start_index=-6到end_index=-1同样是从左往右取值。
>>> [4, 5, 6, 7, 8]
>>>a[:-6] # step=1,从左往右取值,从“起点”开始一直取到end_index=-6。
>>> [0, 1, 2, 3]
>>>a[:-6:-1] # step=-1,从右往左取值,从“终点”开始一直取到end_index=-6。
>>> [9, 8, 7, 6, 5]
>>>a[-6:] # step=1,从左往右取值,从start_index=-6开始,一直取到“终点”。
>>> [4, 5, 6, 7, 8, 9]
>>>a[-6::-1] # step=-1,从右往左取值,从start_index=-6开始,一直取到“起点”。
>>> [4, 3, 2, 1, 0]

5. start_index和end_index正()負(-)混合索引的情況

>>>a[1:-6] # start_index=1在end_index=-6的左边,因此从左往右取值,而step=1同样决定了从左往右取值。
>>> [1, 2, 3]
>>>a[1:-6:-1] # start_index=1在end_index=-6的左边,因此从左往右取值,但step=-则决定了从右往左取值,两者矛盾。
>>> []
>>>a[-1:6] # start_index=-1在end_index=6的右边,因此从右往左取值,但step=1则决定了从左往右取值,两者矛盾。
>>> []
>>>a[-1:6:-1] # start_index=-1在end_index=6的右边,因此从右往左取值,而step=-1同样决定了从右往左取值。
>>> [9, 8, 7]

6.連續切片操作

>>>a[:8][2:5][-1:]
>>> [4]

相當於:

a[:8]=[0, 1, 2, 3, 4, 5, 6, 7]
a[:8][2:5]= [2, 3, 4]
a[:8][2:5][-1:] = 4

理論上可無限次連續切片操作,只要上一次回傳的依然是非空可切片物件。

7.切片操作的三個參數可以用表達式

>>>a[2+1:3*2:7%3] # 即:a[2+1:3*2:7%3] = a[3:6:1]
>>> [3, 4, 5]

8.其他物件的切片操作

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

>>> (0, 1, 2, 3, 4, 5)[:3] # 元组的切片操作
>>> (0, 1, 2)
>>>'ABCDEFG'[::2] # 字符串的切片操作
>>>'ACEG'
>>>for i in range(1,100)[2::3][-10:]: # 利用range函数生成1-99的整数,然后取3的倍数,再取最后十个。
       print(i, end=' ')
>>> 72 75 78 81 84 87 90 93 96 99

四、Python常用切片運算

以列表:a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]為說明物件

1.取偶數位置

>>>b = a[::2]
[0, 2, 4, 6, 8]

2.取奇數位置

>>>b = a[1::2]
[1, 3, 5, 7, 9]

3.拷貝整個物件

>>>b = a[:] # ★★★★★
>>>print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>print(id(a)) # 41946376
>>>print(id(b)) # 41921864
>>>b = a.copy()
>>>print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>print(id(a)) # 39783752
>>>print(id(b)) # 39759176
需要注意的是:[:]和.copy()都属于“浅拷贝”,只拷贝最外层元素,内层嵌套元素则通过引用,而不是独立分配内存。
>>>a = [1,2,['A','B']]
>>>print('a={}'.format(a))
a=[1, 2, ['A', 'B']] # 原始a
>>>b = a[:]
>>>b[0] = 9 # 修改b的最外层元素,将1变成9
>>>b[2][0] = 'D' # 修改b的内嵌层元素
>>>print('a={}'.format(a)) # b修改内部元素A为D后,a中的A也变成了D,说明共享内部嵌套元素,但外部元素1没变。
a=[1, 2, ['D', 'B']] 
>>>print('b={}'.format(b)) # 修改后的b
b=[9, 2, ['D', 'B']] 
>>>print('id(a)={}'.format(id(a)))
id(a)=38669128
>>>print('id(b)={}'.format(id(b)))
id(b)=38669192

4.修改單個元素

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

5.在某個位置插入元素

>>>a[3:3] = ['A','B','C']
[0, 1, 2, 'A', 'B', 'C', 3, 4, 5, 6, 7, 8, 9]
>>>a[0:0] = ['A','B']
['A', 'B', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

6.取代一部分元素

>>>a[3:6] = ['A','B']
[0, 1, 2, 'A', 'B', 6, 7, 8, 9]

五、總結

(一)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:]= [0, 1, 2, 3, 4, 5, 6, 7 , 8, 9],但實際上a[-1:]=a[-1]=9,原因在於step=1表示由左往右取值,而起始索引start_index=-1本身就是物件的最右邊的元素了,再往右已經沒資料了,所以只有a[-1]一個元素。

以上是一文徹底搞懂python切片操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除
Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Apr 02, 2025 am 07:12 AM

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何提高jieba分詞在景區評論分析中的準確性?如何提高jieba分詞在景區評論分析中的準確性?Apr 02, 2025 am 07:09 AM

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...

如何使用正則表達式匹配到第一個閉合標籤就停止?如何使用正則表達式匹配到第一個閉合標籤就停止?Apr 02, 2025 am 07:06 AM

如何使用正則表達式匹配到第一個閉合標籤就停止?在處理HTML或其他標記語言時,常常需要使用正則表達式來�...

如何繞過Investing.com的反爬蟲機制獲取新聞數據?如何繞過Investing.com的反爬蟲機制獲取新聞數據?Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用