Python中使用zip函數(shù)的七重境界解析
1. 引言
Python中有一些內(nèi)置函數(shù),可以使我們的代碼非常優(yōu)雅。zip
函數(shù)就是其中之一,但是zip 函數(shù)的使用對(duì)于初學(xué)者來(lái)說不是很直觀,有時(shí)容易出錯(cuò)。因此本文將從7個(gè)層次來(lái)由淺入深地來(lái)探討強(qiáng)大的zip
函數(shù)的概念、用法和技巧。
閑話少說,我們直接開始吧!
2. Level 0: 了解zip函數(shù)基礎(chǔ)語(yǔ)法
zip
函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的iterator
。
舉例如下,我們可以使用它以如下方式來(lái)組合兩個(gè)列表,樣例代碼如下:
id = [1, 2, 3, 4] leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li'] record = zip(id, leaders) print(record) # <zip object at 0x7f266a707d80> print(list(record)) # [(1, 'Elon Mask'), (2, 'Tim Cook'), (3, 'Bill Gates'), (4, 'Bai Li')]
如上面的示例所示,zip
函數(shù)返回一個(gè)元組迭代器,其中第i 個(gè)元組包含每個(gè)列表中的第i
個(gè)元素。
3. Level 1: zip函數(shù)同時(shí)處理多個(gè)對(duì)象
事實(shí)上,Python中的zip
函數(shù)具有強(qiáng)大的功能,比如它可以一次處理任意數(shù)量的可迭代項(xiàng),而不僅僅是兩個(gè)。
首先,我們來(lái)看如果我們將一個(gè)list 傳遞給 zip
函數(shù),樣例如下:
id = [1, 2, 3, 4] record = zip(id) print(list(record)) # [(1,), (2,), (3,), (4,)]
如果我們同時(shí)傳遞三個(gè)list
,結(jié)果如下:
id = [1, 2, 3, 4]
leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li']
sex = ['m', 'm', 'm', 'm']
record = zip(id, leaders, sex)print(list(record))
# [(1, 'Elon Mask', 'm'), (2, 'Tim Cook', 'm'), (3, 'Bill Gates', 'm'), (4, 'Bai Li', 'm')]
如上所述,無(wú)論我們傳遞給zip
函數(shù)多少個(gè)可迭代項(xiàng),它都能按照我們的預(yù)期來(lái)正常工作。
順便說一下,如果沒有參數(shù),zip
函數(shù)只返回一個(gè)空的迭代器。
4. Level 2: zip函數(shù)處理長(zhǎng)度不等的參數(shù)
真實(shí)數(shù)據(jù)并不總是干凈和完整的,有時(shí)我們必須處理不等長(zhǎng)的可迭代數(shù)據(jù)。默認(rèn)情況下,zip
函數(shù)的結(jié)果基于最短的可迭代項(xiàng)。
舉例如下:
id = [1, 2] leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li'] record = zip(id, leaders) print(list(record)) # [(1, 'Elon Mask'), (2, 'Tim Cook')]
如上面的代碼所示,最短的列表是id
,因此record
只包含兩個(gè)元組,并且忽略了列表leaders
中的最后兩個(gè)元素。
如果最后兩位leader
因被忽視而不高興,我們?cè)撛趺崔k?
Python將再次幫助我們。itertools
模塊中還有一個(gè)名為zip_langest
的函數(shù)。顧名思義,它是zip
函數(shù)的兄弟,其結(jié)果基于最長(zhǎng)的參數(shù)。
我們不妨使用zip_langest
函數(shù)來(lái)生成上述record
列表,結(jié)果如下:
from itertools import zip_longest id = [1, 2] leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li'] long_record = zip_longest(id, leaders) print(list(long_record)) # [(1, 'Elon Mask'), (2, 'Tim Cook'), (None, 'Bill Gates'), (None, 'Bai Li')] long_record_2 = zip_longest(id, leaders, fillvalue='Top') print(list(long_record_2)) # [(1, 'Elon Mask'), (2, 'Tim Cook'), ('Top', 'Bill Gates'), ('Top', 'Bai Li')]
如上所述,zip_langest
函數(shù)基于其最長(zhǎng)參數(shù)來(lái)返回結(jié)果??蛇x的fillvalue
參數(shù)(默認(rèn)值為None
)可以幫助我們填充缺失的值。
5. Level 3: 掌握unzip操作
在上一個(gè)示例中,如果我們首先獲得列表record
,那么我們?nèi)绾螌⑵?code>unzip 解壓縮為單獨(dú)的可迭代項(xiàng)?
不幸的是,Python并沒有直接的解壓縮unzip
函數(shù)。然而,如果我們熟悉星號(hào)*
的技巧,解壓縮將是一項(xiàng)非常簡(jiǎn)單的任務(wù)。
record = [(1, 'Elon Mask'), (2, 'Tim Cook'), (3, 'Bill Gates'), (4, 'Bai Li')] id, leaders = zip(*record) print(id) # (1, 2, 3, 4) print(leaders) # ('Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li')
在上面的示例中,星號(hào)執(zhí)行了拆包操作,即從記錄列表中拆包所有四個(gè)元組。
6. Level 4: 通過zip函數(shù)創(chuàng)建和更新dict
受益于功能強(qiáng)大的zip
函數(shù),基于一些獨(dú)立的列表來(lái)創(chuàng)建和更新dict 將非常方便。
我們可以使用以下one-line
的方案:
● 使用字典生成式和zip函數(shù)
● 使用dict和zip函數(shù)
樣例代碼如下:
id = [1, 2, 3, 4] leaders = ['Elon Mask', 'Tim Cook', 'Bill Gates', 'Bai Li'] # create dict by dict comprehension leader_dict = {i: name for i, name in zip(id, leaders)} print(leader_dict) # {1: 'Elon Mask', 2: 'Tim Cook', 3: 'Bill Gates', 4:'Bai Li'} # create dict by dict function leader_dict_2 = dict(zip(id, leaders)) print(leader_dict_2) # {1: 'Elon Mask', 2: 'Tim Cook', 3: 'Bill Gates', 4: 'Bai Li'} # update other_id = [5, 6] other_leaders = ['Larry Page', 'Sergey Brin'] leader_dict.update(zip(other_id, other_leaders)) print(leader_dict) # {1: 'Elon Mask', 2: 'Tim Cook', 3: 'Bill Gates', 4: ''Bai Li'', 5: 'Larry Page', 6: 'Sergey Brin'}
上面的示例根本不使用for
循環(huán) , 這是多么的優(yōu)雅和Pythonic
!
7. Level 5: 在for循環(huán)中使用zip函數(shù)
同時(shí)處理多個(gè)可迭代項(xiàng)通常是常見的場(chǎng)景, 此時(shí)我們可以在for
循環(huán)中配合使用函數(shù)zip
,這也是我最喜歡函數(shù)zip
的用法之一。
舉例如下:
products = ["cherry", "strawberry", "banana"] price = [2.5, 3, 5] cost = [1, 1.5, 2] for prod, p, c in zip(products, price, cost): print(f'The profit of a box of {prod} is £{p-c}!') # The profit of a box of cherry is £1.5! # The profit of a box of strawberry is £1.5! # The profit of a box of banana is £3!
8. Level 6: 實(shí)現(xiàn)矩陣轉(zhuǎn)置
我們來(lái)看以下問題:
如何優(yōu)雅地實(shí)現(xiàn)矩陣的轉(zhuǎn)置操作?
Wow, 鑒于在上文中我們已經(jīng)介紹了函數(shù)zip
,星號(hào)*
,以及列表生成式,所以one-line
的實(shí)現(xiàn)方式如下:
matrix = [[1, 2, 3], [1, 2, 3]] matrix_T = [list(i) for i in zip(*matrix)] print(matrix_T) # [[1, 1], [2, 2], [3, 3]]
9. 總結(jié)
本文重點(diǎn)介紹了Python中功能強(qiáng)大的zip
函數(shù)的多種用法,并給出了相應(yīng)的代碼示例。
到此這篇關(guān)于Python中使用zip函數(shù)的七重境界的文章就介紹到這了,更多相關(guān)Python中使用zip函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python面向?qū)ο缶幊袒A(chǔ)實(shí)例分析
這篇文章主要介紹了Python面向?qū)ο缶幊袒A(chǔ),結(jié)合實(shí)例形式分析了Python面向?qū)ο缶幊填惖亩x、繼承、特殊方法及模塊相關(guān)原理與操作技巧,需要的朋友可以參考下2020-01-01在Python中構(gòu)建增廣矩陣的實(shí)現(xiàn)方法
今天小編就為大家分享一篇在Python中構(gòu)建增廣矩陣的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-07-07最新版 Windows10上安裝Python 3.8.5的步驟詳解
這篇文章主要介紹了最新版 Windows10上安裝Python 3.8.5的步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Python3.x+pycharm+Anaconda中縮小打包的.exe體積的問題
這篇文章主要介紹了Python3.x+pycharm+Anaconda中縮小打包的.exe體積的問題,本文通過圖文實(shí)例相結(jié)合給大家分享解決方案,需要的朋友可以參考下2021-08-08Python OpenCV使用dlib進(jìn)行多目標(biāo)跟蹤詳解
這篇文章主要為大家介紹了如何使用 dlib 庫(kù)在實(shí)時(shí)視頻中有效地跟蹤多個(gè)對(duì)象,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下2022-03-03使用Python實(shí)現(xiàn)博客上進(jìn)行自動(dòng)翻頁(yè)
這篇文章主要介紹了使用Python實(shí)現(xiàn)博客上進(jìn)行自動(dòng)翻頁(yè),需要的朋友可以參考下2017-08-08Python中矩陣創(chuàng)建和矩陣運(yùn)算方法
今天小編就為大家分享一篇Python中矩陣創(chuàng)建和矩陣運(yùn)算方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-08-08