Python中zip()函數(shù)的解釋和可視化(實(shí)例詳解)
zip()的作用
先看一下語法:
zip(iter1 [,iter2 [...]]) —> zip object
Python的內(nèi)置help()模塊提供了一個(gè)簡短但又有些令人困惑的解釋:
返回一個(gè)元組迭代器,其中第i個(gè)元組包含每個(gè)參數(shù)序列或可迭代對(duì)象中的第i個(gè)元素。當(dāng)最短的可迭代輸入耗盡時(shí),迭代器將停止。使用單個(gè)可迭代參數(shù),它將返回1元組的迭代器。沒有參數(shù),它將返回一個(gè)空的迭代器。
與往常一樣,當(dāng)您精通更一般的計(jì)算機(jī)科學(xué)和Python概念時(shí),此模塊非常有用。但是,對(duì)于初學(xué)者來說,這段話只會(huì)引發(fā)更多問題。讓我們嘗試通過示例,代碼片段和可視化來解釋zip()功能:從許多迭代中獲取元素,然后…… 放在一起
我們可以通過幾個(gè)列表來演示zip()的功能:
uppercase = ['A', 'B', 'C'] lowercase = ['a', 'b', 'c'] for x, y in zip(uppercase, lowercase): print(x, y)
輸出:
A a B b C c
但是,不限于兩個(gè)可迭代對(duì)象作為參數(shù)傳遞-我們可以添加任意多個(gè):
uppercase = ['A', 'B', 'C'] lowercase = ['a', 'b', 'c'] numbers = [1, 2, 3] for x, y, z in zip(uppercase, lowercase, numbers): print(x, y, z)
這將輸出:
A a 1 B b 2 C c 3
讓我們直觀地看一下該zip()函數(shù)在Python中的工作方式:
zip()函數(shù)的另一個(gè)重要警告是如果各個(gè)迭代器的元素個(gè)數(shù)不一致,則返回列表長度與最短的對(duì)象相同:
uppercase = ['A', 'B', 'C', 'D', 'E'] lowercase = ['a', 'b', 'c', 'd'] numbers = [1, 2, 3] for x, y, z in zip(uppercase, lowercase, numbers): print(x, y, z)
輸出:
A a 1 B b 2 C c 3
正如我們所看到的,即使列出了三個(gè)三元組,uppercase和lowercase列表具有5和4個(gè)元素。
要知道的重要一件事是zip()函數(shù)返回什么。
盡管似乎在調(diào)用此函數(shù)時(shí)會(huì)得到一個(gè)列表,但實(shí)際上它返回一個(gè)稱為zip object的特殊數(shù)據(jù)類型,這意味著使用索引將無法瀏覽,下面我們學(xué)習(xí)如何將其轉(zhuǎn)換為其他數(shù)據(jù)類型(例如列表)。
在此之前,我們還應(yīng)再來學(xué)習(xí)一下迭代(Iteration)、迭代器對(duì)象(iterable)、迭代器(iterator )的概念:
- Iteration是計(jì)算機(jī)科學(xué)的通用術(shù)語。它是指對(duì)一組元素執(zhí)行一項(xiàng)操作,一次執(zhí)行一個(gè)元素。一個(gè)很好的例子是循環(huán) -它適用于每個(gè)單獨(dú)的項(xiàng)目,直到整個(gè)項(xiàng)目集運(yùn)行完畢為止。
- Iterable是可以遍歷的對(duì)象(譯者注:在Python中所有東西都是object, 比如說變量,容器,類),iterable是可以產(chǎn)生iterator的object。
- iterator是表示數(shù)據(jù)流的對(duì)象,它一次返回一個(gè)元素的數(shù)據(jù)。它還會(huì)記住其在迭代過程中的位置。本質(zhì)上,它控制應(yīng)如何迭代可迭代對(duì)象。
將zip()對(duì)象轉(zhuǎn)換為列表(并使用索引)
zip()函數(shù)返回一個(gè)zip對(duì)象(類似于map()操作方式)。
zip對(duì)象提供了一些有趣的功能(迭代速度比list更快),但是我們經(jīng)常需要將其轉(zhuǎn)換為list。為了做到這一點(diǎn),我們需要調(diào)用list()函數(shù):
b = ["red", "green", "blue"] c = ["leopard", "cheetah", "jaguar"] print(list(zip(b, c)))
輸出:
[('red', 'leopard'), ('green', 'cheetah'), ('blue', 'jaguar')]
list()函數(shù)將zip對(duì)象轉(zhuǎn)換為一個(gè)元組列表。我們可以使用索引瀏覽各個(gè)元組。出于可讀性考慮,我們首先將新列表分配給一個(gè)變量:
b = ["red", "green", "blue"] c = ["leopard", "cheetah", "jaguar"] new_list = list(zip(b, c)) print(new_list[0]) print(new_list[1]) print(new_list[2])
這將輸出:
('red', 'leopard') ('green', 'cheetah') ('blue', 'jaguar')
將zip()對(duì)象轉(zhuǎn)換成字典
另外,該dict()函數(shù)可用于將zip對(duì)象轉(zhuǎn)換為字典。需要注意的是,只能使用兩個(gè)zip()參數(shù)-前者產(chǎn)生key,后者產(chǎn)生value:
b = ["red", "green", "blue"] f = ["strawberry", "kiwi", "blueberry"] print(dict(zip(b, f)))
輸出:
{'red': 'strawberry', 'green': 'kiwi', 'blue': 'blueberry'}
解壓列表
在某些情況下,我們需要執(zhí)行相反的操作——解壓迭代器。解壓操作涉及將壓縮后的元素恢復(fù)為其原始狀態(tài)。為此,我們添加*運(yùn)算符到函數(shù)調(diào)用中。例:
a = [1, 2, 3] b = [4, 5, 6] zipped = zip(a, b) list(zipped) a2, b2 = zip(*zip(a, b)) print(a == list(a2) and b == list(b2))
輸出:
True
Zip與列表生成式(for循環(huán)潛在問題)
zip()函數(shù)與Python中的for循環(huán)一起使用的可視化
在應(yīng)用for循環(huán)后注意缺少的元素!
Python的另一個(gè)很棒的功能——列表推導(dǎo)式,可以與zip()函數(shù)結(jié)合使用。表面上看起來很簡單……
m = ["mind", "mouse", "mini"] n = ["norm", "night", "necklace"] [print(a, b) for a, b in zip(m, n)]
輸出:
mind norm mouse night mini necklace
看起來很簡單,似乎沒有任何錯(cuò)誤,對(duì)嗎?是的
如果我們想a從列表生成式獲取參數(shù)并打印出來,我們得到a NameError的報(bào)錯(cuò)提示,這是完全正常的,因?yàn)閍在列表推導(dǎo)之外不是實(shí)數(shù):
Traceback (most recent call last): File "C:\Pro\Py\tp-ex\tmp1.py", line 5, in print(a) NameError: name 'a' is not defined
但是,如果我們決定使用for循環(huán)而不是列表生成式,然后打印a,我們會(huì)得到一些奇怪的結(jié)果。請(qǐng)記住,for循環(huán)輸出的結(jié)果與列表生成式的結(jié)果相同。
m = ["mind", "mouse", "mini"] n = ["norm", "night", "necklace"] for m, n in zip(m, n): print(m, n) print(m)
結(jié)果輸出是…
mind norm mouse night mini necklace mini
等等,叛逆的mini在這里干什么?事實(shí)證明,m先前引用的列表變量"mind", "mouse", "mini"被覆蓋了!因此,應(yīng)該牢記列表生成式和for循環(huán)的運(yùn)行方式完全不同。
結(jié)論
好吧,事實(shí)證明,zip()函數(shù)在 Python 中確實(shí)有一些竅門!🙂與往常一樣,鼓勵(lì)大家實(shí)際使用我們的代碼示例,而不僅是閱讀本文。如果您與代碼進(jìn)行交互并對(duì)其進(jìn)行調(diào)整,則肯定會(huì)遇到一些獨(dú)特的問題-解決它們將幫助大家更好地掌握知識(shí)。
翻譯:愛學(xué)習(xí)的胡同學(xué)原文:
總結(jié)
以上所述是小編給大家介紹的Python中zip()函數(shù)的解釋和可視化(實(shí)例詳解),希望對(duì)大家有所幫助!
相關(guān)文章
Django debug為True時(shí),css加載失敗的解決方案
這篇文章主要介紹了Django debug為True時(shí),css加載失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04使用python實(shí)現(xiàn)兩數(shù)之和的畫解算法
這篇文章主要介紹了使用python實(shí)現(xiàn)兩數(shù)之和的畫解算法,采用實(shí)例問題的描述來進(jìn)行問題分析,并給出用暴力求解和哈希表兩種方法解決方案,有需要的朋友可以參考下2021-08-08python實(shí)現(xiàn)批量修改服務(wù)器密碼的方法
這篇文章主要介紹了python實(shí)現(xiàn)批量修改服務(wù)器密碼的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08python用循環(huán)新建多個(gè)列表的代碼實(shí)例
當(dāng)我們處理數(shù)據(jù)時(shí),有時(shí)候需要?jiǎng)?chuàng)建多個(gè)列表以存儲(chǔ)不同類型或不同條件下的數(shù)據(jù),在Python中,我們可以利用循環(huán)來快速、高效地創(chuàng)建這些列表,本文將介紹如何使用循環(huán)在Python中創(chuàng)建多個(gè)列表,并提供代碼實(shí)例,需要的朋友可以參考下2024-04-04使用Python制作自動(dòng)推送微信消息提醒的備忘錄功能
這篇文章主要介紹了使用Python制作自動(dòng)推送微信消息提醒的備忘錄功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-09-09python實(shí)現(xiàn)對(duì)文件中圖片生成帶標(biāo)簽的txt文件方法
下面小編就為大家分享一篇python實(shí)現(xiàn)對(duì)文件中圖片生成帶標(biāo)簽的txt文件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python常用字符串替換函數(shù)strip、replace及sub用法示例
這篇文章主要介紹了Python常用字符串替換函數(shù)strip、replace及sub用法,結(jié)合實(shí)例形式分析了Python針對(duì)字符串替換的常用函數(shù)strip、replace及sub功能及簡單使用技巧,需要的朋友可以參考下2018-05-05