Python中zip()函数的解释和可视化
文章來源于機器學習算法與Python實戰,作者愛學習的胡同學
zip()的作用
先看一下語法:
zip(iter1 [,iter2 [...]]) —> zip objectPython的內置help()模塊提供了一個簡短但又有些令人困惑的解釋:
返回一個元組迭代器,其中第i個元組包含每個參數序列或可迭代對象中的第i個元素。當最短的可迭代輸入耗盡時,迭代器將停止。使用單個可迭代參數,它將返回1元組的迭代器。沒有參數,它將返回一個空的迭代器。
與往常一樣,當您精通更一般的計算機科學和Python概念時,此模塊非常有用。但是,對于初學者來說,這段話只會引發更多問題。讓我們嘗試通過示例,代碼片段和可視化來解釋zip()功能:從許多迭代中獲取元素,然后…… 放在一起
我們可以通過幾個列表來演示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但是,不限于兩個可迭代對象作為參數傳遞-我們可以添加任意多個:
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()函數在Python中的工作方式:
zip()函數的另一個重要警告是如果各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同:
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正如我們所看到的,即使列出了三個三元組,uppercase和lowercase列表具有5和4個元素。
要知道的重要一件事是zip()函數返回什么。
盡管似乎在調用此函數時會得到一個列表,但實際上它返回一個稱為zip object的特殊數據類型,這意味著使用索引將無法瀏覽,下面我們學習如何將其轉換為其他數據類型(例如列表)。
在此之前,我們還應再來學習一下迭代(Iteration)、迭代器對象(iterable)、迭代器(iterator )的概念:
Iteration是計算機科學的通用術語。它是指對一組元素執行一項操作,一次執行一個元素。一個很好的例子是循環 -它適用于每個單獨的項目,直到整個項目集運行完畢為止。
Iterable是可以遍歷的對象(譯者注:在Python中所有東西都是object, 比如說變量,容器,類),iterable是可以產生iterator的object。
iterator是表示數據流的對象,它一次返回一個元素的數據。它還會記住其在迭代過程中的位置。本質上,它控制應如何迭代可迭代對象。
將zip()對象轉換為列表(并使用索引)
zip()函數返回一個zip對象(類似于map()操作方式)。
zip對象提供了一些有趣的功能(迭代速度比list更快),但是我們經常需要將其轉換為list。為了做到這一點,我們需要調用list()函數:
b = ["red", "green", "blue"] c = ["leopard", "cheetah", "jaguar"]print(list(zip(b, c)))輸出:
[('red', 'leopard'), ('green', 'cheetah'), ('blue', 'jaguar')]list()函數將zip對象轉換為一個元組列表。我們可以使用索引瀏覽各個元組。出于可讀性考慮,我們首先將新列表分配給一個變量:
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()對象轉換成字典
另外,該dict()函數可用于將zip對象轉換為字典。需要注意的是,只能使用兩個zip()參數-前者產生key,后者產生value:
b = ["red", "green", "blue"] f = ["strawberry", "kiwi", "blueberry"]print(dict(zip(b, f)))輸出:
{'red': 'strawberry', 'green': 'kiwi', 'blue': 'blueberry'}解壓列表
在某些情況下,我們需要執行相反的操作——解壓迭代器。解壓操作涉及將壓縮后的元素恢復為其原始狀態。為此,我們添加*運算符到函數調用中。例:
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))輸出:
TrueZip與列表生成式(for循環潛在問題)
zip()函數與Python中的for循環一起使用的可視化
在應用for循環后注意缺少的元素!
Python的另一個很棒的功能——列表推導式,可以與zip()函數結合使用。表面上看起來很簡單……
m = ["mind", "mouse", "mini"] n = ["norm", "night", "necklace"][print(a, b) for a, b in zip(m, n)]輸出:
mind norm mouse night mini necklace看起來很簡單,似乎沒有任何錯誤,對嗎?是的
如果我們想a從列表生成式獲取參數并打印出來,我們得到a NameError的報錯提示,這是完全正常的,因為a在列表推導之外不是實數:
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循環而不是列表生成式,然后打印a,我們會得到一些奇怪的結果。請記住,for循環輸出的結果與列表生成式的結果相同。
m = ["mind", "mouse", "mini"] n = ["norm", "night", "necklace"]for m, n in zip(m, n):print(m, n)print(m)結果輸出是…
mind norm mouse night mini necklace mini等等,叛逆的mini在這里干什么?事實證明,m先前引用的列表變量"mind", "mouse", "mini"被覆蓋了!因此,應該牢記列表生成式和for循環的運行方式完全不同。
結論
事實證明,zip()函數在 Python 中確實有一些竅門!????與往常一樣,鼓勵大家實際使用我們的代碼示例,而不僅是閱讀本文。如果您與代碼進行交互并對其進行調整,則肯定會遇到一些獨特的問題-解決它們將幫助大家更好地掌握知識。
原文:https://blog.soshace.com/python-zip-function-explained-and-visualized/
By?Denis Kryukov?
備注:公眾號菜單包含了整理了一本AI小抄,非常適合在通勤路上用學習。
往期精彩回顧2019年公眾號文章精選適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(第一部分)備注:加入本站微信群或者qq群,請回復“加群”加入知識星球(4500+用戶,ID:92416895),請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的Python中zip()函数的解释和可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中enumerate函数的解
- 下一篇: 你一定不能错过的pandas 1.0.0