Python技巧之變長(zhǎng)和定長(zhǎng)序列拆分
Python中的任何序列(可迭代的對(duì)象)都可以通過(guò)賦值操作進(jìn)行拆分,包括但不限于元組、列表、字符串、文件、迭代器、生成器等。
1.元組拆分
元組拆分是最為常見(jiàn)的一種拆分,示例如下:
p = (4, 5) x, y = p print(x, y) # 4 5
如果寫成
x, y, z = p
那么就會(huì)拋出ValueError異常: “not enough values to unpack (expected 3, got 2)”
如果寫成
p = (4, 5, 6) x, y = p
那么就會(huì)拋出ValueError異常: “ too many values to unpack (expected 2)”
2.字符串拆分
字符串的拆分示意如下:
s = 'Hello' a, b, c, d, e = s print(a) # H
3.拆分時(shí)丟棄值
如果在拆分時(shí)想丟棄某些特定的值,可以用一個(gè)用不到的變量名來(lái)作為丟棄值的名稱(常選'_'做為變量名),如下所示:
s = 'Hello' a, b, _, d, _ = s print(a) # H
4.嵌套序列拆分
Python也提供簡(jiǎn)潔的對(duì)嵌套序列進(jìn)行拆分的語(yǔ)法。如下所示我們對(duì)一個(gè)比較復(fù)雜的異質(zhì)列表進(jìn)行拆分:
data = ['zhy', 50, 123.0, (2000, 12, 21)] name, shares, price, (year, month, day) = data print(year) # 2000
如果你想完整地得到(2000, 12, 21)這個(gè)表示時(shí)間戳的元組,那么你就得這樣寫:
data = ['zhy', 50, 123.0, (2000, 12, 21)] name, shares, price, date = data print(date) # (2000, 12, 21)
5.從任意長(zhǎng)度的可迭代對(duì)象中拆分
之前我們說(shuō)過(guò),如果我們想從可迭代對(duì)象中分解出N個(gè)元素,但如果這個(gè)可迭代對(duì)象長(zhǎng)度超過(guò)N,則會(huì)拋出異常"too many values to unpack"。針對(duì)這個(gè)問(wèn)題的解決方案是采用"*"表達(dá)式。
比如我們給定學(xué)生的分?jǐn)?shù),想去掉一個(gè)最高分和一個(gè)最低分,然后對(duì)剩下的學(xué)生求平均分,我們可以這樣寫:
def avg(data: list):
return sum(data)/len(data)
# 去掉最高分,最低分然后做均分統(tǒng)計(jì)
def drop_first_last(grades):
first, *middle, last = grades
return avg(middle)
print(drop_first_last([1,2,3,4])) # 2.5
還有一種情況是有一些用戶記錄,記錄由姓名+電子郵件+任意數(shù)量的電話號(hào)碼組成,則我們可以這樣分解用戶記錄:
record = ['zhy', 'zhy1056692290@qq.com', '773-556234', '774-223333'] name, email, *phone_numbers = record print(phone_numbers) # ['773-556234', '774-223333']
事實(shí)上,如果電話號(hào)碼為空也是合法的,此時(shí)phone_numbers為空列表。
record = ['zhy', 'zhy1056692290@qq.com'] name, email, *phone_numbers = record print(phone_numbers) # []
還有一種使用情況則更為巧妙。如果我們需要遍歷變長(zhǎng)元組組成的列表,這些元組長(zhǎng)度不一。那么此時(shí)*表達(dá)式可大大簡(jiǎn)化我們的代碼。
records = [('foo', 1, 2), ('bar', 'hello'), ('foo', 3, 4)]
for tag, *args in records:
if tag == 'bar':
print(args)
# ['hello']
在對(duì)一些復(fù)雜的字符串進(jìn)行拆分時(shí),*表達(dá)式也顯得特別有用。
line = "nobody:*:-2:-2:-2:Unprivileged User:/var/empty:/usr/bin/false"
uname, *fields, home_dir, sh = line.split(':')
print(home_dir) # /var/empty
*表達(dá)式也可以和我們前面說(shuō)的嵌套拆分和變量丟棄一起結(jié)合使用。
record = ['ACME', 50, 123.45, (128, 18, 2012)] name, *_, (*_, year) = record print(year) # 2012
最后再介紹*表達(dá)式用于遞歸函數(shù)的一種黑魔法,比如與遞歸求和結(jié)合可以這樣寫:
items = [1, 10, 7, 4, 5, 9]
def sum(items):
head, *tail = items
return head + sum(tail) if tail else head
print(sum(items)) # 36
不過(guò),Python由于自身遞歸棧的限制,并不擅長(zhǎng)遞歸。我們最后一個(gè)遞歸的例子可以做為一種學(xué)術(shù)上的嘗試,但不建議在實(shí)踐中使用它。
到此這篇關(guān)于Python技巧之變長(zhǎng)和定長(zhǎng)序列拆分的文章就介紹到這了,更多相關(guān)Python變長(zhǎng)和定長(zhǎng)序列拆分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python函數(shù)中的可變長(zhǎng)參數(shù)詳解
- Python函數(shù)中*args和**kwargs來(lái)傳遞變長(zhǎng)參數(shù)的用法
- Python中函數(shù)的參數(shù)傳遞與可變長(zhǎng)參數(shù)介紹
- Python函數(shù)中的不定長(zhǎng)參數(shù)相關(guān)知識(shí)總結(jié)
- python print 格式化輸出,動(dòng)態(tài)指定長(zhǎng)度的實(shí)現(xiàn)
- python 窮舉指定長(zhǎng)度的密碼例子
- python函數(shù)不定長(zhǎng)參數(shù)使用方法解析
- python 初始化一個(gè)定長(zhǎng)的數(shù)組實(shí)例
相關(guān)文章
關(guān)于Python參數(shù)解析器argparse的應(yīng)用場(chǎng)景
這篇文章主要介紹了關(guān)于Python參數(shù)解析器argparse的應(yīng)用場(chǎng)景,argparse 模塊使編寫用戶友好的命令行界面變得容易,程序定義了所需的參數(shù),而 argparse 將找出如何從 sys.argv 中解析這些參數(shù),需要的朋友可以參考下2023-08-08
Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(1)
這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
Python利用cv2動(dòng)態(tài)繪制圓和矩形的示例詳解
這篇文章主要為大家詳細(xì)介紹了Python如何利用cv2實(shí)現(xiàn)動(dòng)態(tài)繪制圓和矩形的功能,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以參考一下2023-03-03
Python實(shí)現(xiàn)Excel文件的合并(以新冠疫情數(shù)據(jù)為例)
這篇將以新冠疫情數(shù)據(jù)為例,詳細(xì)介紹了如何利用Python實(shí)現(xiàn)合并Excel文件,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-03-03
python語(yǔ)言time庫(kù)和datetime庫(kù)基本使用詳解
這篇文章主要介紹了python語(yǔ)言time庫(kù)和datetime庫(kù)基本使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
利用Python代碼實(shí)現(xiàn)模擬動(dòng)態(tài)指針時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了如何利用python和C++代碼實(shí)現(xiàn)模擬動(dòng)態(tài)指針時(shí)鐘,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04
python模塊詳解之pywin32使用文檔(python操作windowsAPI)
pywin32是一個(gè)第三方模塊庫(kù),主要的作用是方便python開(kāi)發(fā)者快速調(diào)用windows API的一個(gè)模塊庫(kù),這篇文章主要給大家介紹了關(guān)于python模塊詳解之pywin32使用文檔的相關(guān)資料,文中將python操作windowsAPI介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01

