【Python】掌握Python中的索引和切片
作者 | Giorgos Myrianthous
編譯 | VK
來源 | Towards Data Science
在Python中,像字符串或列表這樣的有序序列的元素可以通過它們的索引單獨(dú)訪問。這可以通過提供我們希望從序列中提取的元素的數(shù)字索引來實(shí)現(xiàn)。另外,Python支持切片,這是一個(gè)特性,可以讓我們提取原始sequence對象的子集。
在本文中,我們將探討索引和切片是如何工作的,以及如何使用它們來編寫更干凈、更具python風(fēng)格的代碼。
索引
與大多數(shù)編程語言一樣,Python偏移量從位置0開始,在位置N-1結(jié)束,其中N被定義為序列的總長度。例如,字符串Hello的總長度等于5,每個(gè)字符都可以通過索引0到4進(jìn)行訪問,如下圖所示:
現(xiàn)在,你可以通過編程方式訪問字符串中的各個(gè)字符,方法是提供要獲取的相應(yīng)偏移量(用方括號括起來):
>>>?my_string?=?'Hello' >>>?print(my_string[0]) 'H' >>>?print(my_string[2]) 'l' >>>?print(my_string[3]) 'l'同樣重要的是要知道,當(dāng)你嘗試訪問大于序列長度(減1)的偏移量時(shí),Python將拋出一個(gè)IndexError,通知你請求的偏移量超出范圍:
>>>?my_string[5] Traceback?(most?recent?call?last):File?"<input>",?line?1,?in?<module> IndexError:?string?index?out?of?range還可以通過提供一個(gè)負(fù)索引來訪問元素,該索引基本上對應(yīng)于從序列右側(cè)開始的索引。最后一項(xiàng)可以通過-1訪問,倒數(shù)第二項(xiàng)可以通過-2訪問,依此類推
從技術(shù)上講,當(dāng)使用負(fù)偏移量時(shí),Python會將該偏移量添加到序列的長度中,以便推斷準(zhǔn)確的位置。例如,假設(shè)我們要使用負(fù)偏移量從字符串my_string = 'Hello’中提取字符e。現(xiàn)在表達(dá)式my_string[-4]基本上將被翻譯成my_string[len(my_string) - 4],它相當(dāng)于my_string[5 - 4]和my_string[1],最終為我們提供所需的輸出:
>>>?my_string[-4] 'e'切片
切片是一種索引形式,它允許我們推斷原始序列的整個(gè)(子)部分,而不僅僅是單個(gè)項(xiàng)。
要在Python中對序列執(zhí)行切片,需要提供兩個(gè)由冒號分隔的偏移量,盡管在某些情況下可以只定義其中一個(gè),甚至不定義(下面將討論更多關(guān)于這些情況的內(nèi)容)。
第一個(gè)偏移量表示起點(diǎn)并包含在內(nèi),而第二個(gè)偏移量表示終點(diǎn),但與起點(diǎn)偏移量不同,它不包含在內(nèi)。
my_string[start:end]因此,在執(zhí)行切片時(shí),Python將返回一個(gè)新對象,其中包含從下索引開始到上索引少一個(gè)位置的所有元素。作為一個(gè)例子,考慮一個(gè)用例,其中我們需要獲取字符串的前兩個(gè)元素:
>>>?my_string[0:2] 'He'正如我已經(jīng)提到的,2個(gè)位置都提供并不是強(qiáng)制性的。如果忽略起始偏移量,則其值將默認(rèn)為0。另一方面,如果不提供結(jié)束偏移量,則其默認(rèn)值將等于序列的長度。實(shí)際上有三種不同的情況,如下所示:
my_string[0:]???#?忽略終點(diǎn) my_string[:-1]??#?忽略起點(diǎn) my_string[:]????#?都忽略忽略終點(diǎn)偏移
當(dāng)我們想切掉前導(dǎo)文本時(shí),第一個(gè)符號通常很有用。假設(shè)我們想要得到字符串的第一個(gè)字符以外的所有字符。我們可以使用以下符號
>>>?my_string?=?'Hello' >>>?my_string[1:] 'ello'正如我們已經(jīng)提到的,當(dāng)結(jié)束偏移量被忽略時(shí),默認(rèn)是序列的長度:
>>>?my_string[1:]?==?my_string[1:len(my_string)] True忽略起始偏移
假設(shè)我們現(xiàn)在只需要字符串的第一個(gè)字符。在這種情況下,忽略起始偏移量將起到以下作用:
>>>?my_string?=?'Hello' >>>?my_string[:-1] 'Hell'如果跳過下限,則其值將默認(rèn)為0:
>>>?my_string[:-1]?==?my_string[0:-1] True忽略兩個(gè)偏移
Python中的切片表示法允許我們省略起始偏移和結(jié)束偏移。
>>>?my_string?=?'Hello' >>>?my_string[:]?==?my_string[0:len(my_string)] True如果忽略下限和上限,則默認(rèn)值分別為0和len(序列),你可能想知道這是否有幫助或用處。好吧,這是一種快速復(fù)制對象的方法,如下所示
>>>?my_string?=?'Hello' >>>?my_string_copy?=?my_string[:]請注意,當(dāng)此切片技術(shù)將生成一個(gè)不同的對象時(shí),該對象將被分配到不同的內(nèi)存位置。這對字符串之類的不可變對象類型沒有任何區(qū)別,但是在處理列表之類的可變對象類型時(shí),注意這一點(diǎn)非常重要。
擴(kuò)展切片
Python中的切片表達(dá)式附帶了第三個(gè)索引,該索引是可選的,指定時(shí)用作步驟。顯然,當(dāng)省略step值時(shí),它默認(rèn)為1,這意味著請求的sequence子部分中的任何元素都不會被跳過。符號如下所示
[start:end:step]例如,假設(shè)我們有一個(gè)字符串,其中包含字母表中的字母,我們希望從位于位置1和19的字母中提取其中的所有其他項(xiàng),:
>>>?import?string >>>?my_string?=?string.ascii_lowercase?#?'abcdefg...' >>>?my_string[1:20:1] 'bdfhjlnprt'這種符號可以用來代替列表生成式。例如,假設(shè)我們想要得到一個(gè)列表中所有具有偶數(shù)索引的元素。實(shí)現(xiàn)這一點(diǎn)的列表生成式是
>>>?my_list?=?[100,?400,?34,?179,?0,?89,?121] >>>?[value?for?index,?value?in?enumerate(my_list)?if?index?%?2?==?0] [100,?34,?0,?121]在這種情況下,切片表示法可以使我們的代碼更簡單,可讀性更高:
>>>?my_list?=?[100,?400,?34,?179,?0,?89,?121] >>>?my_list[::2] [100,?34,?0,?121]與開始偏移和結(jié)束偏移一樣,步長索引可以是負(fù)數(shù)。從技術(shù)上講,當(dāng)我們想要反轉(zhuǎn)有序序列中元素的順序時(shí),這是很有用的
>>>?my_string?=?'Hello' >>>?my_string[::-1] 'olleH'換句話說,當(dāng)應(yīng)用負(fù)步幅索引時(shí),起始偏移和結(jié)束偏移的效果是相反的。為了弄清楚這一點(diǎn),讓我們跳到另一個(gè)例子中,我們實(shí)際上定義了所有三個(gè)可能的偏移量。
>>>?import?string >>>?my_string?=?string.ascii_lowercase?#?'abcdefg...' >>>?my_string[20:10:-1] 'utsrqponml'在上面的例子中,我們基本上按照相反的順序從索引11到20創(chuàng)建一個(gè)新字符串。
結(jié)論
在本文中,我們探討了在Python中索引和切片是如何工作的。這兩種符號在大多數(shù)Python應(yīng)用程序中都被廣泛使用,因此你需要確保了解它們是如何工作的。
索引
第一項(xiàng)從偏移量0開始
最后一項(xiàng)結(jié)束于偏移長度len(my_sequence) - 1
負(fù)指數(shù)表示計(jì)數(shù)將向后開始。從本質(zhì)上講,它被添加到序列的長度中。例如,my_string[-1]轉(zhuǎn)換為my_string[len(my_string) - 1]
切片
起始索引(下限)包含在內(nèi)
結(jié)束索引(上限)不包含在內(nèi)
當(dāng)忽略起始索引時(shí),它默認(rèn)為0
如果省略結(jié)束索引,則默認(rèn)為序列的長度
如果省略起始索引和結(jié)束索引,則會創(chuàng)建原始對象的副本-my_string[:]
第三個(gè)索引表示步幅
省略步幅索引時(shí),默認(rèn)為1(即不跳過任何元素)
負(fù)步幅索引可以幫助我們創(chuàng)建反向序列(例如,my_string[::-1])
總結(jié)
以上是生活随笔為你收集整理的【Python】掌握Python中的索引和切片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雨林木风win11 64位原版系统v20
- 下一篇: 【Python】五种Pandas图表美化