網站首頁 編程語言 正文
1. 引言
Python中有一些內置函數,可以使我們的代碼非常優雅。zip
函數就是其中之一,但是zip 函數的使用對于初學者來說不是很直觀,有時容易出錯。因此本文將從7個層次來由淺入深地來探討強大的zip
函數的概念、用法和技巧。
閑話少說,我們直接開始吧!
2. Level 0: 了解zip函數基礎語法
zip
函數用于將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的iterator
。
舉例如下,我們可以使用它以如下方式來組合兩個列表,樣例代碼如下:
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
函數返回一個元組迭代器,其中第i 個元組包含每個列表中的第i
個元素。
3. Level 1: zip函數同時處理多個對象
事實上,Python中的zip
函數具有強大的功能,比如它可以一次處理任意數量的可迭代項,而不僅僅是兩個。
首先,我們來看如果我們將一個list 傳遞給 zip
函數,樣例如下:
id = [1, 2, 3, 4] record = zip(id) print(list(record)) # [(1,), (2,), (3,), (4,)]
如果我們同時傳遞三個list
,結果如下:
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')]
如上所述,無論我們傳遞給zip
函數多少個可迭代項,它都能按照我們的預期來正常工作。
順便說一下,如果沒有參數,zip
函數只返回一個空的迭代器。
4. Level 2: zip函數處理長度不等的參數
真實數據并不總是干凈和完整的,有時我們必須處理不等長的可迭代數據。默認情況下,zip
函數的結果基于最短的可迭代項。
舉例如下:
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
只包含兩個元組,并且忽略了列表leaders
中的最后兩個元素。
如果最后兩位leader
因被忽視而不高興,我們該怎么辦?
Python將再次幫助我們。itertools
模塊中還有一個名為zip_langest
的函數。顧名思義,它是zip
函數的兄弟,其結果基于最長的參數。
我們不妨使用zip_langest
函數來生成上述record
列表,結果如下:
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
函數基于其最長參數來返回結果。可選的fillvalue
參數(默認值為None
)可以幫助我們填充缺失的值。
5. Level 3: 掌握unzip操作
在上一個示例中,如果我們首先獲得列表record
,那么我們如何將其unzip
解壓縮為單獨的可迭代項?
不幸的是,Python并沒有直接的解壓縮unzip
函數。然而,如果我們熟悉星號*
的技巧,解壓縮將是一項非常簡單的任務。
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')
在上面的示例中,星號執行了拆包操作,即從記錄列表中拆包所有四個元組。
6. Level 4: 通過zip函數創建和更新dict
受益于功能強大的zip
函數,基于一些獨立的列表來創建和更新dict 將非常方便。
我們可以使用以下one-line
的方案:
● 使用字典生成式和zip函數
● 使用dict和zip函數
樣例代碼如下:
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
循環 , 這是多么的優雅和Pythonic
!
7. Level 5: 在for循環中使用zip函數
同時處理多個可迭代項通常是常見的場景, 此時我們可以在for
循環中配合使用函數zip
,這也是我最喜歡函數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: 實現矩陣轉置
我們來看以下問題:
如何優雅地實現矩陣的轉置操作?
Wow, 鑒于在上文中我們已經介紹了函數zip
,星號*
,以及列表生成式,所以one-line
的實現方式如下:
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. 總結
本文重點介紹了Python中功能強大的zip
函數的多種用法,并給出了相應的代碼示例。
原文鏈接:https://blog.csdn.net/sgzqc/article/details/128434877
相關推薦
- 2022-03-03 MacOS git pull / git clone Enter passphrase for ke
- 2022-09-30 Ajax實現關鍵字聯想和自動補全功能及遇到坑_AJAX相關
- 2022-07-28 pytest使用parametrize將參數化變量傳遞到fixture_python
- 2022-11-07 C語言內存函數?memcpy,memmove?,memcmp_C 語言
- 2022-06-13 docker鏡像的拉取登陸上傳及保存等相關使用命令_docker
- 2022-09-14 C#通過不安全代碼看內存加載的示例詳解_C#教程
- 2022-12-04 Python學習之字典和集合的使用詳解_python
- 2022-11-27 Python?Django教程之實現待辦事項應用程序_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支