天天看點

[python字元串的索引與切片操作_Python對象類型之索引與切片

intumu.com:機器學習(ML)、人工智能(AI)和土木工程的(TM)關系?​zhuanlan.zhihu.com

[python字元串的索引與切片操作_Python對象類型之索引與切片

前言

着手開始寫的時候就一直有一個畫面在腦子中出現:小豬佩奇第N級,豬爸爸拿出來一本《混凝土的故事》,打開書的時候說道:混凝土是由砂子、水、水泥組成的,結果其他人都睡着了。于是,我在想,要是給土木人講:python萬法皆對象,對象類型有:數字:int,long,float,complex,bool

字元:str,unicod

清單:list

字典:dict

元組:tuple

檔案:file

其他類型:集合(set),當機集合(frozenset),類類型等。

是不是也有人睡着?相反,如果我直接說砂子、水泥、鋼筋、混凝土,是不是覺得親切?是以接下來将會從一磚一瓦的建築材料說Python。

萬法皆對象:在基建領域,你所看到的構築物就是有以上提到的基礎建材組成;在Python領域對象類型就可以看做基礎建築材料,然後由不同的施工工藝産生不同的單體子產品或構造物。例如:一個函數(施工工藝)所包含的參數(基礎建材),形成一個僞代碼。

僞代碼

#圍牆條形基礎開挖

變量類型:鏟子、䦆頭、羊角碾、塊石、磚頭、水泥、混凝土

#工藝流程:

開挖條形基坑

夯實基礎

抛填塊片石

混凝土填充找平

砌磚

#以上即為面向過程程式設計,下面先說說數字類型。

真代碼(字元串)

索引和分片

索引

對于一個有序序列,可以通過索引的方法來通路對應位置的值。字元串便是一個有序序列的例子,Python使用 [] 來對有序序列進行索引。

s = "hello world"

s[0]

'h'

Python中索引是從 0 開始的,是以索引 0 對應與序列的第 1 個元素。為了得到第 5 個元素,需要使用索引值 4 。

s[4]

'o'

除了正向索引,Python還引入了負索引值的用法,即從後向前開始計數,例如,索引 -2 表示倒數第 2 個元素:

s[-2]

'l'

單個索引大于等于字元串的長度時,會報錯:

s[11]

---------------------------------------------------------------------------

IndexError Traceback (most recent call last)

in ()

----> 1 s[11]

IndexError: string index out of range

分片

分片用來從序列中提取出想要的子序列,其用法為:

var[lower:upper:step]

其範圍包括 lower ,但不包括 upper ,即 [lower, upper), step 表示取值間隔大小,如果沒有預設為1。

s

s[1:3]

分片中包含的元素的個數為 3-1=2 。

也可以使用負索引來指定分片的範圍:

s[1:-2]

'ello wor'

包括索引 1 但是不包括索引 -2 。

lower和upper可以省略,省略lower意味着從開頭開始分片,省略upper意味着一直分片到結尾。

s[:3]

'hel'

s[-3:]

'rld'

s[:]

'hello world'

每隔兩個取一個值:

s[::2]

'hlowrd'

當step的值為負時,省略lower意味着從結尾開始分片,省略upper意味着一直分片到開頭。

s[::-1]

'dlrow olleh'

當給定的upper超出字元串的長度(注意:因為不包含upper,是以可以等于)時,Python并不會報錯,不過隻會計算到結尾。

s[:100]

'hello world'

使用“0”作為索引開頭的原因

使用[low, up)形式的原因

假設需要表示字元串 hello 中的内部子串 el :

|方式|[low, up)|(low, up]|(lower, upper)|[lower, upper] |--|--|--|--|--| |表示|[1,3)|(0,2]|(0,3)|[1,2] |序列長度|up - low|up - low|up - low - 1|up - low + 1

對長度來說,前兩種方式比較好,因為不需要煩人的加一減一。

現在隻考慮前兩種方法,假設要表示字元串hello中的從頭開始的子串hel:

|方式|[low, up)|(low, up] |--|--| |表示|[0,3)|(-1,2]| |序列長度|up - low|up - low|

第二種表示方法從-1開始,不是很好,是以選擇使用第一種[low, up)的形式。

使用0-base的形式Just to beautiful to ignore.

----Guido van Rossum

兩種簡單的情況:從頭開始的n個元素;使用0-base:[0, n)

使用1-base:[1, n+1)

第i+1個元素到第i+n個元素。使用0-base:[i, n+i)

使用1-base:[i+1, n+i+1)

1-base有個+1部分,是以不推薦。

綜合這兩種原因,Python使用0-base的方法來進行索引。

土木狗的視角:上一節講了字元串,我們把一段字元串看做磚頭,也說了工地搬磚砌牆的過程中會遇到填空洞或者半截磚,需要用到瓦刀按需截斷。事實上,本節的索引和切片也是異曲同工的,比如在爬網絡資料的時間中,很多字元串很‘髒’,有空格或者各種非正常的編碼字元嵌入其中,最簡單的方式就是使用切片功能,至于正則提取,那是後話,到時候會給大家教一招RE正則中的萬能法則,本節就不贅述。

課後作業(可選)

按上一節運作自己的項目,建立一個*.ipynb檔案,将上面代碼敲入運作。

intumu.com:Python資料分析及可視化執行個體目錄​zhuanlan.zhihu.com

[python字元串的索引與切片操作_Python對象類型之索引與切片