Python 中的 zip()函數

2021-03-06 小白玩轉Python
假設我們有兩個列表,一個包含名字,另一個包含姓氏。我們希望以某種方式將名字與相應的姓氏組合成元組。換句話說,我們希望將來自多個具有相同索引的迭代對象的元素組合在一個元組列表中:
list_1 = [『Jane』, 『John』, 『Jennifer』]list_2 = [『Doe』, 『Williams』, 『Smith』]Desired Output:[('Jane', 'Doe'), ('John', 'Williams'), ('Jennifer', 'Smith')]

我們可以使用 zip()函數來實現這一點,這是一個內置的 Python 函數。函數之所以命名為 zip()函數,是因為它的類似機制是物理拉鏈。當你拉上拉鏈的時候,你把兩邊都拉在了一起。這就是 zip()函數的工作原理!它將來自多個迭代對象的相同索引的元素作為相同元組的元素放在一起。函數接受迭代對象作為參數,例如列表、文件、元組、集合等。函數將創建一個迭代器,從傳入的每個迭代對象中聚合元素。換句話說,它將返回一個元組迭代器,其中 i-th 元組將包含傳入的每個迭代器中的 i-th 元素。一旦最短的輸入迭代用完,該迭代器將停止。基於上述目標,我們有兩個列表(這是可迭代的對象) ,我們希望將每個列表中相同的索引元素組合在一起。因此,我們可以使用 zip()函數來完成以下任務:
first_names = [『Jane』, 『John』, 『Jennifer』]last_names = [『Doe』, 『Williams』, 『Smith』]full_names = list(zip(first_names, last_names))print(full_names)# [('Jane', 'Doe'), ('John', 'Williams'), ('Jennifer', 'Smith')]

請記住,zip()函數返回一個迭代器。因此,我們需要使用 list()函數,它將使用這個返回的迭代器(或 zip對象)來創建列表。此外,只要傳入的迭代對象是有序的(序列) ,那么元組將包含與在 zip()函數中傳入的參數相同的從左到右順序的元素。假設我們有另外一個列表,年齡,包含了另外兩個列表中相應個體的年齡,名字和姓氏。我們還想在元組中包括年齡,並且有名和姓。如上所述,zip()函數可以接受任意數量的迭代。
first_names = ['Jane', 'John', 'Jennifer']last_names = ['Doe', 'Williams', 'Smith']ages = [20, 40, 30]names_and_ages = list(zip(first_names, last_names, ages))print(names_and_ages)# [('Jane', 'Doe', 20), ('John', 'Williams', 40), ('Jennifer', 'Smith', 30)]

請注意 names_and_ages 是如何包含帶有 n 個元素的元組(參數數量相同,或者可迭代對象,我們傳遞給 zip()函數)。如果我們只將一個可迭代的對象傳遞給 zip()函數,那麼我們將得到一個包含1條目元組的列表,如下所示:
first_names = ['Jane', 'John', 'Jennifer']print(list(zip(first_names)))# [('Jane',), ('John',), ('Jennifer',)]

如果我們傳入長度不等的列表(或其他可迭代對象)會怎樣?換句話說,假設我們的姓氏列表比名字列表多包含1個元素。如上所述,一旦最短的輸入迭代用完,zip()函數返回的迭代器就會停止。換句話說,我們的元組列表將只包含索引中的元素,這些元素出現在傳遞到 zip()函數的所有迭代中。因此,在較長的迭代中的其餘元素將被忽略。
first_names = [『Jane』, 『John』, 『Jennifer』]last_names = [『Doe』, 『Williams』, 『Smith』, 'Jones']full_names = list(zip(first_names, last_names))print(full_names)# [('Jane', 'Doe'), ('John', 'Williams'), ('Jennifer', 'Smith')]

如果需要較長的迭代對象中的元素,那麼我們可以使用 itertools.zip _ longest ()函數來代替 zip()函數。它將繼續執行,直到用盡最長的可迭代值,並將用傳入的 fillvalue 參數值(默認值為 None)替換任何缺失的值。我們可以使用 zip()函數並行迭代多個迭代對象。因為 zip()函數返回一個迭代器,所以我們可以在 for 循環中使用這個 zip 對象(它返回的迭代器)。由於每次迭代都返回一個元組,我們可以在 for 循環中 unzip 這個元組的元素:
first_names = ['Jane', 'John', 'Jennifer']last_names = ['Doe', 'Williams', 'Smith']for first, last in zip(first_names, last_names):    print(first, last)Jane DoeJohn WilliamsJennifer Smith

first_names = [『Jane』, 『John』, 『Jennifer』]last_names = [『Doe』, 『Williams』, 『Smith』]ages = [20, 40, 30]for first, last, age in zip(first_names, last_names, ages):    print(f』{first} {last} is {age} years old』)Jane Doe is 20 years oldJohn Williams is 40 years oldJennifer Smith is 30 years old

我們有兩個清單: 收入清單和成本清單。我們想再列一個表,利潤,也就是收入和成本之間的差額。我們可以通過並行迭代來實現:
revenue = [30000, 50000, 70000, 90000]cost = [10000, 15000, 20000, 30000]profit = []total_profit = 0for revenue, cost in zip(revenue, cost):    profit.append(revenue — cost)    total_profit += revenue — costprint(profit)print(total_profit)

first_and_last_names = [('Jane', 'Doe'), ('John', 'Williams'), ('Jennifer', 'Smith')]

我們希望將這些元組中的元素分離成兩個單獨的列表。好吧,既然這是拉鏈的反義詞(把東西拉在一起) ,那就是拉鏈的解開(把東西拆開)。要在 Python 中進行 unzip 操作,我們可以使用 zip()函數的 unzip 操作符 * ,如下所示:
first_names, last_names = zip(*first_and_last_names)first_names = list(first_names)last_names = list(last_names)print(first_names)# ['Jane', 'John', 'Jennifer']print(last_names)# ['Doe', 'Williams', 'Smith']

unpacking 運算符 * 將元組的第一個和最後一個名稱列表 unpack 到它的元組中。然後,這些元組將被傳遞給 zip()函數,該函數將接收這些單獨的可迭代對象(元組) ,並將它們相同的索引元素組合成元組,形成兩個單獨的元組。最後,通過元組 unpack 操作,這些分隔的元組將被分配給名字和姓氏變量。然後,我們使用 list()函數將這些元組轉換為列表。在本教程中,我們了解了 zip()函數在 Python 中是如何工作的。我們了解了 zip()函數在不同場景中的操作方式,比如使用一個迭代或者使用長度不等的迭代。然後,我們看到了如何使用 zip()函數並行迭代多個迭代對象。最後,我們學習了如何使用解壓縮操作符 * 來解壓 Python 中的對象。

相關焦點

  • Python zip函數及用法
    所謂「壓縮」,其實就是將這些序列中對應位置的元素重新組合,生成一個個新的元組。和 Python 3.x 版本不同,Python 2.x 版本中的 zip() 函數會直接返回列表,而不是返回 zip 對象。但是,返回的列表或者 zip 對象,其包含的元素(都是元組)是相同的。zip() 函數的語法格式為:zip(iterable, ...)
  • 【牙慧】枯燥的小知識027——Python zip函數,Python reversed函數,Python sorted函數
    Python zip函數及用法zip() 函數是 Python 內置函數之一,它可以將多個序列(
  • Python中的zip方法
    軟硬體環境anaconda3 with python 3.7簡介zip()是python中的一個內置函數,它接受一系列可迭代對象作為參數,將不同對象中相對應的元素(根據索引)打包成一個元組tuple,返回一個zip對象,可以通過list將zip對象轉化為list對象。
  • 一文看懂Python列表表達式及高階函數如lamda, zip, enumerate, map和filter方法.
    python 3中zip方法合併列表後生成的是zip對象,使用list方法可以將其變成列表,使用dict方法可以將其變成字典。map方法可以接收函數作為參數,並將其映射於列表的多個元素。python 2中返回列表,python 3中返回迭代器,需要使用list方法再生成列表。map函數不僅支持自定義的函數和lambda函數,還支持python自帶的函數。下面是map函數應用一個最簡單的例子。該例子將計算平方的lambda函數映射於列表中的每個元素。
  • Python中幾個有趣的函數
    除了眾多第三方庫和方法函數,python自帶的很多函數也非常有趣,用起來稱得上優雅。今天主要是分享5個python內置的小函數,都是個人覺得強大而精緻的幾個函數。不是高深的知識,純粹因為覺得好用而分享。
  • Python大佬簡簡單單利用字典破解zip文件口令
    python,不知道從何學起。QQ群:101677771原理主要是利用python裡自帶的zipfile庫中的extractall函數來實現的,簡單導入zipfile之後,實例化一個ZipFile類。利用extractall()來解壓這個文件,並在參數pwd上填入正確密碼這時我們發現執行腳本之後,fate.zip會被正確解壓,而填入錯誤密碼則會入下圖一樣報錯因此我們可以利用因口令不正確而拋出的異常來測試字典文件中是否有zip文件的密碼,並利用try expect來處理異常信息。
  • Python中有哪些內置函數呢?以及內置函數實例
    >Python中有哪些內置函數呢?高級內置函數enumerate 返回一個可以枚舉的對象eval 取出 字符串中的內容,將字符串str當成有效的表達式來求指並返回計算結果exec 執行字符串或complie方法編譯過的字符串
  • Python語言中enumerate()及zip()函數的使用例子
    在Python程式語言中,enumerate()及zip()是兩個常用的內置函數,這兩個函數功能類似,但又有所區別,下面通過兩個例子分別進行說明。enumerate()函數該函數在字面上是枚舉、列舉的意思,用於將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中,可同時得到數據對象的值及對應的索引值。
  • Python文檔研讀系列:zip函數
    zip() in conjunction with the * operator can be used to unzip a list:Formerly, zip() required at least one argument and zip() raised a TypeError
  • python小課堂17 - 30行代碼破解加密ZIP文件
    前言今天來點實戰乾貨,想必之前的小課堂中一直在講基礎也會顯得非常枯燥,有了前面的相關知識,即可以實現本章內容。若有不懂得的地方,請回顧python小課堂1-16。暴力破解的實現思路利用python內置模塊zipfile來實現破解文件,zipfile模塊有一種函數,其可以實現將壓縮文件路徑傳入,通過函數返回值去調用提取文件的方法,若文件是加密的且密碼傳入的不正確,程序則會發生異常(也就是程序報錯
  • Python中的map函數
    軟硬體環境anaconda3 with python 3.7簡介map是python中的一個內置函數
  • Python 中最快解壓 zip 文件的方法 | Linux 中國
    假設現在的上下文(LCTT 譯註:context,計算機術語,此處意為業務情景)是這樣的:一個 zip 文件被上傳到一個Web 服務[1]中,然後 Python 需要解壓這個 zip 文件然後分析和處理其中的每個文件。
  • Python黑客入門:暴力破解zip,零基礎也可以學會!
    在python中操作zip文件,最簡單的方式就是使用zipfile模塊,使用該模塊可以用來判斷一個文件是否是壓縮文件,創建、解壓文件,獲取zip文件的元數據信息。可以使用python的help方法查看該模塊的使用方法。
  • Python中10個常用的內置函數
    大家好,我是小張在 3.8 版本中,Python 解釋器有近 69 個內置函數可供使用,有了它們能極大地提高編碼效率,數量雖然不少,但在日常搬磚中只用到其中一部分,根據使用頻率和用法,這裡列出來幾個本人認為不錯的內置函數,結合一些例子介紹給大家
  • Python 中 10 個常用的內置函數
    在 3.8 版本中,Python 解釋器有近 69 個內置函數可供使用,有了它們能極大地提高編碼效率數量雖然不少,但在日常搬磚中只用到其中一部分,根據使用頻率和用法,這裡列出來幾個本人認為不錯的內置函數,結合一些例子介紹給大家complex()
  • 學Python,從列表推導到zip()函數,這五種技巧應知應會
    在本文中,作者介紹了 5 種方法,也許在入門階段時,我們還不太了解它們,但在實戰中這 5 個技巧非常實用。字符串運算列表推導式lambda 和 map()單行條件語句zip()字符串運算字符串本質上也是一種元組,但是字符串有很多「運算」方式。
  • 乾貨分享丨Python從入門到編寫POC之特殊函數
    函數:zip( )是Python的一個內建函數,它接受一系列可迭代的對象作為參數,將對象中對應的元素打包成一個個tuple(元組),然後返回由這些tuples組成的list(列表)。若傳入參數的長度不等,則返回list的長度和參數中長度最短的對象相同。利用*號操作符,可以將list unzip(解壓)。通過help命令來看:>>> help(zip)Help on built-in function zip in module __builtin__:zip(...)
  • 一些值得學習的Python內置函數
    len在Python中,我們不寫像my_list.length()或my_string.length()這樣的函數; 相反,我們會奇怪地(至少對於新的python開發者來說)使用len(my_list)和len(my_string)。
  • ​PyFlink 教程(二):PyFlink Table API - Python 自定義函數
    在純 SQL 作業中使用 Python 自定義函數Flink SQL 中的 CREATE FUNCTION 語句支持註冊 Python 自定義函數,因此用戶除了可以在 PyFlink Table API 作業中使用 Python 自定義函數之外,還可以在純 SQL 作業中使用 Python 自定義函數。
  • Python的68個內置函數
    lst) print(list(it)) lst = [1, 2, 3, 4, 5, 6, 7]print(lst[1:3:1]) # [2,3]s = slice(1, 3, 1)  print(lst[s]) print(str(123)+'456') print("{} {}".format("hello",