Python 基礎(chǔ)切片整理

知乎問(wèn)答之 Python 切片

這是一個(gè)知乎問(wèn)答的補(bǔ)充。原問(wèn)題是python中字符串 s[ : -1]是什么意思气破?,當(dāng)時(shí)回答的內(nèi)容只是對(duì)問(wèn)題本身的簡(jiǎn)單回答,對(duì) Python 切片中的重要信息是有所忽略的贡耽。如果以slice對(duì)象的方式進(jìn)行切片的話,其語(yǔ)法是這樣的:slice(start, stop[, step]),在原回答中把重要的step給忽略掉了蒲赂,當(dāng)然阱冶,題主也沒(méi)有問(wèn)到。但仍然很有必要把 Python 切片中的重要信息給補(bǔ)充上滥嘴。所以木蹬,在這里重新整理一下 Python 切片相關(guān)知識(shí),主要參考 Python 官方文檔若皱、博客文章镊叁、以及 Python 書(shū)籍《Python 編程快速上手 讓繁瑣工作自動(dòng)化》和《Python 編程無(wú)師自通 專(zhuān)業(yè)程序員的養(yǎng)成》。

切片

切片是:將一個(gè)可迭代對(duì)象中元素的子集走触,創(chuàng)建為一個(gè)新的可迭代對(duì)象晦譬。可迭代對(duì)象包括所有序列類(lèi)型互广,如基本序列類(lèi)型:list, tuplerange 對(duì)象敛腌,以及特別定制的附加序列類(lèi)型,strbytes惫皱。利用 Python 的切片功能可實(shí)現(xiàn)對(duì)序列的提取像樊、倒序、淺復(fù)制和修改逸吵、刪除元素的操作凶硅。

切片的實(shí)現(xiàn)方法

要實(shí)現(xiàn)切片有兩種方法,一是索引擴(kuò)展(Extending Indexing)的方式扫皱;二是slice對(duì)象的方式足绅。語(yǔ)法如下所示:

索引擴(kuò)展(Extending Indexing)

sequence [start:stop[:step]]

start
Optional. Starting index of the slice. Defaults to 0.
stop
Optional. The last index of the slice or the number of items to get. Defaults to len(sequence).
step
Optional. Extended slice syntax. Step value of the slice. Defaults to 1.

slice對(duì)象,其實(shí)方括號(hào)(下標(biāo)/索引)標(biāo)記在內(nèi)部使用的就是 slice 對(duì)象韩脑。

sequence [slice(start, stop[, step])]

序列元素訪問(wèn)復(fù)習(xí)——索引

在開(kāi)始切片之前氢妈,讓我們先復(fù)習(xí)一下序列元素的訪問(wèn)。切片的其中一種方法是索引擴(kuò)展(Extending Indexing)段多,那么要訪問(wèn)序列的元素可以用索引首量,其實(shí)切片也是訪問(wèn)元素的一種,區(qū)別在于切片是返回序列进苍,而索引是返回單個(gè)元素加缘。

序列索引只能是整數(shù),不能是浮點(diǎn)值觉啊。不然將導(dǎo)致 TypeError 錯(cuò)誤拣宏。序列訪問(wèn)支持負(fù)數(shù)索引,即:可用來(lái)從右向左查找杠人,可迭代對(duì)象中元素的索引(必須是一個(gè)負(fù)數(shù))勋乾。整數(shù)值 ?1 指的是 列表中的最后一個(gè)索引宋下,?2 指的是列表中倒數(shù)第二個(gè)索引,以此類(lèi)推辑莫,在這里重點(diǎn)注意学歧,負(fù)數(shù)索引是向后查找,從右往左的各吨,切片同樣支持負(fù)數(shù)枝笨。如下圖:

列表索引可用負(fù)數(shù)表示,圖片來(lái)自 GeeksforGeeks 網(wǎng)站的文章《String Slicing in Python》中的配圖

正式開(kāi)始切片

切片時(shí)包含起始索引位置的元素绅你,但不包括結(jié)束索引位置的元素伺帘,即[start,stop)昭躺。當(dāng)start + 1 == stop時(shí)返回一個(gè)元素忌锯;當(dāng)start == stop時(shí)返回一個(gè)空(empty)序列。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[1:5] # ['b', 'c', 'd', 'e']
l[1:2] # ['b']
l[4:4] # []

Python 切片

作為快捷方法领炫,你可以省略切片中冒號(hào)兩邊的一個(gè)索引或兩個(gè)索引偶垮。省略第一個(gè)索引相當(dāng)于使用 0,或列表的開(kāi)始帝洪。省略第二個(gè)索引相當(dāng)于使用列表的長(zhǎng)度似舵,意味著切片直至列表的末尾。當(dāng)兩個(gè)都省略時(shí)葱峡,即返回一個(gè)原索引的淺復(fù)制(shallow copy)砚哗。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[:3] # ['a', 'b', 'c']
l[0:3] # ['a', 'b', 'c']
l[4:] # ['e', 'f', 'g', 'h', 'i']
l[4:len(l)] # ['e', 'f', 'g', 'h', 'i']
l1 = l[:] # 淺復(fù)制
l is l1 # False
Python 切片

切片中的負(fù)數(shù)索引,同樣從右往左向后查找砰奕。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[-7:-2] # ['c', 'd', 'e', 'f', 'g']
l[2:7] # ['c', 'd', 'e', 'f', 'g']
l[2:-5] # ['c', 'd']
l[-8:] # ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[:-1] # ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
Python 切片

Python 切片負(fù)數(shù)向后查找示意圖蛛芥,圖片來(lái)自 LearnByExample.org 文章《Python List Slicing》配圖

到現(xiàn)在為止,還沒(méi)有為切片設(shè)定step值军援,其實(shí)是在使用默認(rèn)值仅淑,默認(rèn)值為1,即每次移動(dòng)一個(gè)序列元素胸哥。如果想要跳過(guò)一些元素涯竟,就可以顯式設(shè)定step的值。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[2:7:2] # ['c', 'e', 'g']
Python 切片

同樣的空厌,step也支持負(fù)數(shù)庐船,也是向后采集的意思。如果setp為負(fù)數(shù)嘲更,start值必須大于stop筐钟,不然將會(huì)得到一個(gè)空(empty)序列;如果省略start值哮内,相當(dāng)于從原序列的末尾開(kāi)始盗棵,如果省略stop值壮韭,相當(dāng)于從原序列的開(kāi)始結(jié)束;而如果start值和stop值都省略纹因,并把step值設(shè)置為1的話喷屋,將會(huì)得到一個(gè)反轉(zhuǎn)的(reversed)序列。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[6:1:-2] # ['g', 'e', 'c']
l[1:6:-2] # []
l[:6:-1] # ['i', 'h']
l[6::-1] # ['g', 'f', 'e', 'd', 'c', 'b', 'a']
l[::-1] # ['i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']
Python 切片

切片除了可以查找序列中的元素之外瞭恰,還有一些重要的功能就是修改序列/元素屯曹、刪除序列元素。

# 修改
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[1:4] = [1, 2, 3] # 修改后結(jié)果為:['a', 1, 2, 3, 'e', 'f', 'g', 'h', 'i']
l[1:2] = [1, 2, 3] # 修改/替換后的結(jié)果為:['a', 1, 2, 3, 2, 3, 'e', 'f', 'g', 'h', 'i']

# 插入
l = ['a', 'b', 'c']
l[:0] = [1, 2, 3] # 插入后結(jié)果為:[1, 2, 3, 'a', 'b', 'c']

l = ['a', 'b', 'c']
l[len(l):] = [1, 2, 3] # 插入后結(jié)果為:['a', 'b', 'c', 1, 2, 3]

l = ['a', 'b', 'c']
l[1:1] = [1, 2, 3] # 插入后結(jié)果為:['a', 1, 2, 3, 'b', 'c']

# 刪除
l = ['a', 'b', 'c', 'd', 'e']
l[1:5] = [] # 刪除后結(jié)果為:['a']

# 還可以用 del 語(yǔ)句刪除序列中的部分元素
l = ['a', 'b', 'c', 'd', 'e']
del l[1:5] # 刪除后結(jié)果為:['a']惊畏,效果一樣
Python 切片

以上都是索引擴(kuò)展(Extending Indexing)的方法實(shí)現(xiàn)切片恶耽,現(xiàn)在再來(lái)看看slice對(duì)象。同樣的颜启,可以為其指定start值和stop值偷俭,step是一個(gè)可選參數(shù),默認(rèn)是1缰盏。要注意的是slice對(duì)象可以只給一個(gè)參數(shù)涌萤,這時(shí)就相當(dāng)于[:stop],如果把這個(gè)參數(shù)設(shè)為None就相當(dāng)于[:]口猜。

l = ['a', 'b', 'c', 'd', 'e']
s = slice(1, 5, 2) # slice(1, 5, 2)
s = slice(1, 5) # slice(1, 5, None)
s = slice(5) # slice(None, 5, None)
s = slice(None) # slice(None, 5, None)
s = slice(None) # slice(None, None, None)
Python 切片之 slice 對(duì)象

關(guān)于 Python 切片基本就整理到此负溪,初學(xué)者使用切片可能容易出錯(cuò)。需要記住的是济炎,負(fù)數(shù)從右向左查找川抡;切片時(shí)包含起始索引位置的元素,但不包括結(jié)束索引位置的元素须尚,即[start,stop)崖堤;當(dāng)你的stop不是預(yù)期時(shí),可以設(shè)置為stop + 1或省略恨闪,尤其是step為負(fù)數(shù)的情況下倘感;切片中的 index不會(huì)發(fā)生list index out of range的錯(cuò)誤。以上可能有錯(cuò)漏的地方咙咽,歡迎指正老玛。作為非大神,菜鳥(niǎo)一只的我钧敞,拍磚也懇請(qǐng)輕拍蜡豹。

這次的 Python 切片整理是源于一個(gè)知乎問(wèn)答,python中字符串 s[ : -1]是什么意思溉苛?镜廉,當(dāng)時(shí)主要是摘錄了兩本書(shū)的相關(guān)章節(jié)內(nèi)容,后面再慢慢搜索整理愚战、補(bǔ)充娇唯。其實(shí)讀書(shū)無(wú)論是對(duì)于新手還是老司機(jī)都是學(xué)習(xí)的好方法齐遵,這不,前段時(shí)間從阮一峰先生博客看到一個(gè)資源鏈接塔插,于是也把里面的書(shū)單給整理出來(lái)了梗摇,可能是因?yàn)槎际呛脮?shū)吧,基本上都能找到對(duì)應(yīng)的中文版本想许。這其中還有兩本免費(fèi)的英文原版書(shū)伶授,《Python Programming: An Introduction to Computer Science 》和《Learning With Python: How to Think Like a Computer Scientist》。有興趣的可以稍作移步了解一下流纹,就在知乎專(zhuān)欄文章上:自學(xué) Python 可以選擇哪些入門(mén)書(shū)籍糜烹,這當(dāng)然也是源于一個(gè)知乎問(wèn)答的整理自學(xué)Python可以選擇哪些入門(mén)書(shū)籍?漱凝。

Note:這是知乎問(wèn)答的一篇恰飯稿疮蹦,略有改動(dòng)。原恰飯文章地址在此:知乎問(wèn)答之 Python 切片整理碉哑,和如果你去擺地?cái)?/a>性質(zhì)類(lèi)似挚币。

參考

Python 官方文檔-術(shù)語(yǔ)表 slice

Python 官方文檔-Python 標(biāo)準(zhǔn)庫(kù) 內(nèi)置函數(shù) slice()

Python 官方文檔-Python 語(yǔ)言參考 del 語(yǔ)句

GeeksforGeeks 網(wǎng)站文章《String Slicing in Python》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市扣典,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慎玖,老刑警劉巖贮尖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異趁怔,居然都是意外死亡湿硝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)润努,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)关斜,“玉大人,你說(shuō)我怎么就攤上這事铺浇×⌒螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵鳍侣,是天一觀的道長(zhǎng)丁稀。 經(jīng)常有香客問(wèn)我,道長(zhǎng)倚聚,這世上最難降的妖魔是什么线衫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮惑折,結(jié)果婚禮上授账,老公的妹妹穿的比我還像新娘枯跑。我一直安慰自己,他們只是感情好白热,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布全肮。 她就那樣靜靜地躺著,像睡著了一般棘捣。 火紅的嫁衣襯著肌膚如雪辜腺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天乍恐,我揣著相機(jī)與錄音评疗,去河邊找鬼。 笑死茵烈,一個(gè)胖子當(dāng)著我的面吹牛百匆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呜投,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼加匈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了仑荐?” 一聲冷哼從身側(cè)響起雕拼,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粘招,沒(méi)想到半個(gè)月后免胃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吨掌,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡联予,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年檐薯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袍冷。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磷醋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胡诗,到底是詐尸還是另有隱情邓线,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布乃戈,位于F島的核電站褂痰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏症虑。R本人自食惡果不足惜缩歪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谍憔。 院中可真熱鬧匪蝙,春花似錦主籍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至颤绕,卻和暖如春幸海,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奥务。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工物独, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氯葬。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓挡篓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親帚称。 傳聞我的和親對(duì)象是個(gè)殘疾皇子官研,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345