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