电竞比分网-中国电竞赛事及体育赛事平台

分享

5個(gè) Python 切片技巧,讓你的代碼更加優(yōu)雅

 喜歡站在山上 2021-01-31

在Python世界中,有許多小技巧可以對(duì)我們的代碼產(chǎn)生很大的影響。特別是對(duì)于大型程序,這些小技巧可以使我們的代碼更整潔和優(yōu)雅。

切片操作(slice operator)就是其中的一個(gè)。它可以幫助我們優(yōu)雅的從可迭代對(duì)象中獲取想要的元素,例如我們有一個(gè)如下的列表:

a = [1,2,3,4,5,6]

如果我們想獲取列表 a 的奇數(shù)項(xiàng)該怎么寫?

正常來說可以編寫一個(gè)包含if-else語(yǔ)句的for循環(huán)語(yǔ)句過濾列表的元素,這個(gè)可行,就是多了許多不必要的代碼。

其實(shí)這個(gè)問題只需要一行代碼就可以解決:

a[::2]

沒有 for 循環(huán),沒有 if-else 語(yǔ)句,只需一行。這就是切片技術(shù)。

下面就將介紹5個(gè)有用的Python切片技巧。

切片運(yùn)算符的模板

在探索其用法之前,我們需要了解編寫切片(slice)運(yùn)算符的模板:

a_list[start:end:step]

如上所示,該操作包含三個(gè)參數(shù):

start: 起始索引 (默認(rèn)值是 0)

end: 結(jié)束索引 (默認(rèn)值是該列表的長(zhǎng)度)

step: 步長(zhǎng) (默認(rèn)值是 1)

這三個(gè)參數(shù)都是可以選項(xiàng)。

了解了模板之后,現(xiàn)在讓我們看看這5個(gè)技巧是如何工作的。

1.獲取列表的前N個(gè)或后N個(gè)項(xiàng)目

我們?cè)俅问褂蒙弦粋€(gè)列表作 a 為示例:

a = [1,2,3,4,5,6]

如何獲取前三個(gè)項(xiàng)?很簡(jiǎn)單:

a[:3] # 輸出: [1, 2, 3]

在上面的代碼中,start 從 0 開始,也就是該參數(shù)的默認(rèn)值,所以我們就寫 end 索引是多少

那如何獲取后三個(gè)項(xiàng)目呢? 這里就用到了負(fù)數(shù)索引:

a[-3:] # 輸出: [4, 5, 6]

眾所周知,大多數(shù)編程語(yǔ)言都支持正索引,并且索引從0開始。

但是 Python 是個(gè)很特別的語(yǔ)言,它支持負(fù)索引。它從 -1 開始,換句話說,-1代表最后一個(gè)項(xiàng)目,-2代表倒數(shù)第二個(gè)項(xiàng)目,依此類推。

因此,當(dāng)我們需要獲取列表的最后n個(gè)項(xiàng)目時(shí),只需通過負(fù)索引即可獲取它。

2.取列表的第N個(gè)項(xiàng)目

我們可以通過第三個(gè)參數(shù)步長(zhǎng)(step), 更加靈活的處理切片任務(wù),比如獲取列表的奇數(shù)項(xiàng):

a = [1, 2, 3, 4, 5, 6]a[::2] # 輸出 [1, 3, 5]

這里有個(gè)常用的小技巧就是通過它翻轉(zhuǎn)列表:

a = [1, 2, 3, 4, 5, 6]a[::-1] # 輸出 [6, 5, 4, 3, 2, 1]

正步數(shù)是從列表頭開始,負(fù)步數(shù)就是從列表最后開始。

3.淺復(fù)制列表

淺表復(fù)制的最簡(jiǎn)單方法是使用以下切片技巧:

a = [1, 2, 3, 4, 5, 6]b = a[:]b[0]=100print(b) # 輸出 [100, 2, 3, 4, 5, 6]print(a) # 輸出 [1, 2, 3, 4, 5, 6]

4. 一次操作多個(gè)列表元素

如果我們需要處理列表中的多個(gè)元素,是否必須使用 for 循環(huán)?

并不一定,我們?nèi)匀豢梢酝ㄟ^切片運(yùn)算符執(zhí)行某些任務(wù),例如分配或刪除而無(wú)需for循環(huán)。我們來看一些例子:

一次刪除多個(gè)列表元素

a = [1, 2, 3, 4, 5, 6]del a[:2]print(a) # 輸出 [3, 4, 5, 6]

調(diào)整列表大小

a = [1, 2, 3, 4, 5, 6]a[:4] = [7,8]print(a) # 輸出 [7, 8, 5, 6]

5.使用切片對(duì)象(Slice Object)存儲(chǔ)切片索引

如果我們用相同的索引對(duì)許多列表進(jìn)行切片,那么可能會(huì)有太多的數(shù)字,即使借助切片技巧,我們的代碼也會(huì)變得難看。像下面的代碼

a = [1, 2, 3, 4, 5, 6]b = [3, 4, 5, 6, 7, 8, 9]c = [2, 3, 4, 5, 100, 101, 102]a2 = a[1:5:2]b2 = b[1:5:2]c2 = c[1:5:2]

更不用說如果所需的索引更改了,我們必須一一修改相應(yīng)的索引。

一般來說,在一個(gè)程序中放入許多相同的數(shù)字不是一個(gè)好習(xí)慣。 這種情況下就可以使用切片對(duì)象(Slice Object)來存儲(chǔ)切片索引。

a = [1, 2, 3, 4, 5, 6]b = [3, 4, 5, 6, 7, 8, 9]c = [2, 3, 4, 5, 100, 101, 102]indexes = slice(1, 5, 2)a2 = a[indexes]b2 = b[indexes]c2 = c[indexes]

如上所示,內(nèi)置的切片對(duì)象是一個(gè)簡(jiǎn)單的輔助工具,可以幫助我們存儲(chǔ)三個(gè)數(shù)字并在需要時(shí)使用它。如果索引更改,我們只需要修改slice對(duì)象中的數(shù)字即可。

總結(jié)

Python 為我們提供了一些語(yǔ)法糖,可以使我們的代碼更具可讀性和優(yōu)雅性。切片技術(shù)就是一個(gè)很好的例子。了解并應(yīng)用這些小技巧可以極大地提高我們的代碼質(zhì)量。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多