Python切片操作深入詳解
本文實(shí)例講述了Python切片操作。分享給大家供大家參考,具體如下:
我們基本上都知道Python的序列對(duì)象都是可以用索引號(hào)來(lái)引用的元素的,索引號(hào)可以是正數(shù)由0開(kāi)始從左向右,也可以是負(fù)數(shù)由-1開(kāi)始從右向左。
在Python中對(duì)于具有序列結(jié)構(gòu)的數(shù)據(jù)來(lái)說(shuō)都可以使用切片操作,需注意的是序列對(duì)象某個(gè)索引位置返回的是一個(gè)元素,而切片操作返回是和被切片對(duì)象相同類(lèi)型對(duì)象的副本。
如下面的例子,雖然都是一個(gè)元素,但是對(duì)象類(lèi)型是完全不同的:
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[0] 0 >>> alist[0:1] [0]
通常一個(gè)切片操作要提供三個(gè)參數(shù) [start_index: stop_index: step]
start_index是切片的起始位置
stop_index是切片的結(jié)束位置(不包括)
step可以不提供,默認(rèn)值是1,步長(zhǎng)值不能為0,不然會(huì)報(bào)錯(cuò)ValueError。
當(dāng) step 是正數(shù)時(shí),以list[start_index]
元素位置開(kāi)始, step做為步長(zhǎng)到list[stop_index]
元素位置(不包括)為止,從左向右截取,
start_index和stop_index不論是正數(shù)還是負(fù)數(shù)索引還是混用都可以,但是要保證 list[stop_index]
元素的【邏輯】位置
必須在list[start_index]
元素的【邏輯】位置右邊,否則取不出元素。
比如下面的幾個(gè)例子都是合法的:
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[1:5] [1, 2, 3, 4] >>> alist[1:-1] [1, 2, 3, 4, 5, 6, 7, 8] >>> alist[-8:6] [2, 3, 4, 5]
當(dāng) step 是負(fù)數(shù)時(shí),以list[start_index]
元素位置開(kāi)始, step做為步長(zhǎng)到list[stop_index]
元素位置(不包括)為止,從右向左截取,
start_index和stop_index不論是正數(shù)還是負(fù)數(shù)索引還是混用都可以,但是要保證 list[stop_index]
元素的【邏輯】位置
必須在list[start_index]
元素的【邏輯】位置左邊,否則取不出元素。
比如下面的幾個(gè)例子都是合法的:
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[-1: -5: -1] [9, 8, 7, 6] >>> alist[9: 5: -1] [9, 8, 7, 6] >>> alist[-1:1:-1] [9, 8, 7, 6, 5, 4, 3, 2] >>> alist[6:-8:-1] [6, 5, 4, 3]
假設(shè)list的長(zhǎng)度(元素個(gè)數(shù))是length, start_index和stop_index在符合虛擬的邏輯位置關(guān)系時(shí),
start_index和stop_index的絕對(duì)值是可以大于length的。比如下面兩個(gè)例子:
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[-11:11] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[11:-11:-1] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
另外start_index和stop_index都是可以省略的,比如這樣的形式 alist[:]
, 被省略的默認(rèn)由其對(duì)應(yīng)左右邊界起始元素開(kāi)始截取。
看一下具體的實(shí)例:
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[:] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Python中切片操作的實(shí)現(xiàn)機(jī)制
(注:Python中前后雙下劃線名字的方法(函數(shù))叫特殊方法,也有稱(chēng)魔術(shù)方法的,這是從ruby那里借用的。
通常特殊方法都是應(yīng)當(dāng)由解釋器去調(diào)用的,對(duì)程序員的接口通常是看起來(lái)更簡(jiǎn)潔的方式,如常見(jiàn)的 len(list)
實(shí)質(zhì)是解釋器調(diào)用list.__len__()
方法。)
實(shí)際上在Python中對(duì)list引用元素和形式優(yōu)雅簡(jiǎn)潔的切片操作都是由解釋器調(diào)用的list.__getitem__(x)
特殊方法。
>>> help(list.__getitem__) Help on method_descriptor: __getitem__(...) x.__getitem__(y) <==> x[y]
其中x可以是個(gè)整數(shù)對(duì)象或切片對(duì)象。
alist[5]
和 alist.__getitem__(5)
是完全等效的。
>>> alist[5] 5 >>> alist.__getitem__(5) 5 >>>
而切片操作是把切片對(duì)象作參數(shù)調(diào)用__getitem__()
,
>>> help(slice) Help on class slice in module builtins: class slice(object) | slice(stop) | slice(start, stop[, step]) | | Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).
見(jiàn)下面的例子。
>>> alist[1:7:2] [1, 3, 5] >>> slice_obj = slice(1,7,2) >>> alist.__getitem__(slice_obj) [1, 3, 5] >>>
一些常用的切片操作
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 取前一部分 >>> alist[:5] [0, 1, 2, 3, 4] # 取后一部分 >>> alist[-5:] [5, 6, 7, 8, 9] # 取偶數(shù)位置元素 >>> alist[::2] [0, 2, 4, 6, 8] # 取奇數(shù)位置元素 >>> alist[1::2] [1, 3, 5, 7, 9] # 淺復(fù)制,等價(jià)于list.copy()更加面向?qū)ο蟮膶?xiě)法 >>> blist = alist[:] >>> blist [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 返回一個(gè)逆序列表,推薦reversed(list)的寫(xiě)法,更直觀易懂。 >>> alist[::-1] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] # 在某個(gè)位置插入多個(gè)元素 >>> alist[3:3] = ['a','b','c'] >>> alist [0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9] # 在開(kāi)始位置之前插入多個(gè)元素 >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[:0] = ['a','b','c'] >>> alist ['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 替換多個(gè)元素 >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[0:3] = ['a','b','c'] >>> alist ['a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9] # 刪除切片 >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> del alist[3:6] >>> alist [0, 1, 2, 6, 7, 8, 9]
從上面這些實(shí)例可以看到Python的切片操作非常靈活、強(qiáng)大、簡(jiǎn)潔、優(yōu)雅,如果能全面掌握和正確運(yùn)用將會(huì)對(duì)你的編寫(xiě)Python代碼水平會(huì)有很大提升。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
PyQt5 界面顯示無(wú)響應(yīng)的實(shí)現(xiàn)
這篇文章主要介紹了PyQt5 界面顯示無(wú)響應(yīng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03python3 pandas 讀取MySQL數(shù)據(jù)和插入的實(shí)例
下面小編就為大家分享一篇python3 pandas 讀取MySQL數(shù)據(jù)和插入的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python IDLE 錯(cuò)誤:IDLE''''s subprocess didn''''t make connectio
這篇文章主要介紹了Python IDLE 錯(cuò)誤:IDLE's subprocess didn't make connection 的解決方案的相關(guān)資料,需要的朋友可以參考下2017-02-02Python 模擬購(gòu)物車(chē)的實(shí)例講解
下面小編就為大家?guī)?lái)一篇Python 模擬購(gòu)物車(chē)的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09使用Python進(jìn)行物聯(lián)網(wǎng)設(shè)備的控制與數(shù)據(jù)收集
Python作為一種高效且易于學(xué)習(xí)的編程語(yǔ)言,已經(jīng)成為開(kāi)發(fā)物聯(lián)網(wǎng)應(yīng)用的首選語(yǔ)言之一,本文將探討如何使用Python進(jìn)行物聯(lián)網(wǎng)設(shè)備的控制與數(shù)據(jù)收集,并提供相應(yīng)的代碼示例,需要的朋友可以參考下2024-05-05python字符串和常用數(shù)據(jù)結(jié)構(gòu)知識(shí)總結(jié)
在本文中我們系統(tǒng)的給大家整理了關(guān)于python字符串和常用數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí)點(diǎn)以及實(shí)例代碼,需要的朋友們學(xué)習(xí)下。2019-05-05