Python切片操作深入詳解
本文實(shí)例講述了Python切片操作。分享給大家供大家參考,具體如下:
我們基本上都知道Python的序列對(duì)象都是可以用索引號(hào)來引用的元素的,索引號(hào)可以是正數(shù)由0開始從左向右,也可以是負(fù)數(shù)由-1開始從右向左。
在Python中對(duì)于具有序列結(jié)構(gòu)的數(shù)據(jù)來說都可以使用切片操作,需注意的是序列對(duì)象某個(gè)索引位置返回的是一個(gè)元素,而切片操作返回是和被切片對(duì)象相同類型對(duì)象的副本。
如下面的例子,雖然都是一個(gè)元素,但是對(duì)象類型是完全不同的:
>>> 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]
元素位置開始, 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]
元素位置開始, 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)左右邊界起始元素開始截取。
看一下具體的實(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ù))叫特殊方法,也有稱魔術(shù)方法的,這是從ruby那里借用的。
通常特殊方法都是應(yīng)當(dāng)由解釋器去調(diào)用的,對(duì)程序員的接口通常是看起來更簡(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]).
見下面的例子。
>>> 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ū)ο蟮膶懛? >>> blist = alist[:] >>> blist [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 返回一個(gè)逆序列表,推薦reversed(list)的寫法,更直觀易懂。 >>> 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] # 在開始位置之前插入多個(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ì)你的編寫Python代碼水平會(huì)有很大提升。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python實(shí)現(xiàn)批量注冊(cè)網(wǎng)站用戶的示例
今天小編就為大家分享一篇python實(shí)現(xiàn)批量注冊(cè)網(wǎng)站用戶的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02Pycharm2020.1安裝中文語言插件的詳細(xì)教程(不需要漢化)
這篇文章主要介紹了Pycharm2020.1安裝中文語言插件的詳細(xì)教程,不需要漢化,本文給大家分享三種方法,在這小編推薦使用方法二,具體內(nèi)容詳情大家跟隨小編一起看看吧2020-08-08Python generator生成器和yield表達(dá)式詳解
這篇文章主要介紹了Python generator生成器和yield表達(dá)式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python OS系統(tǒng)解決路徑中空格原因?qū)е挛募虿婚_的問題
這篇文章主要介紹了Python OS系統(tǒng)解決路徑中空格原因?qū)е挛募虿婚_的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02基于Python實(shí)現(xiàn)通過微信搜索功能查看誰把你刪除了
這篇文章主要介紹了基于Python實(shí)現(xiàn)微信搜索查看誰把你刪除了的相關(guān)資料,需要的朋友可以參考下2016-01-01