在 Python 中遍歷兩個列表
- 在 Python 中遍歷兩個列表
-
在 Python 中使用
zip()
函式迭代兩個列表 -
在 Python 中使用
izip()
函式迭代兩個列表 -
在 Python 中使用
map()
函式迭代兩個列表 -
在 Python 中使用
zip_longest()
函式迭代兩個列表
在解析儲存在字典、元組、列表等資料結構中的資料時,我們會遇到迭代以移動儲存在其中的資料序列。
在 Python 中迭代單個資料結構(如列表)是很常見的,但是如果我們遇到期望我們一起迭代兩個/多個列表的場景怎麼辦?
本文將通過一些演示揭示在 Python 中迭代兩個列表的不同方法。
在 Python 中遍歷兩個列表
我們可以使用 for
迴圈或 range()
函式遍歷單個 Python 列表。
range(start, stop, step)
函式使我們能夠從定義的值範圍中獲取一系列數字。它接受 start
、stop
和 step
作為輸入。
其中,
start
索引是range()
函式開始迭代並獲取數字或元素的位置。stop
索引確定元素序列的迭代應該停止的位置或整數。step
索引是一個可選引數,它允許我們在列表中元素序列的迭代中包含諸如增量之類的模式。
參考下面的例子。我們用一些任意值宣告一個列表,然後使用諸如 range()
之類的任何內建函式在列表中迴圈。
lst = [10, 2, 0, 1]
for x in range(0, 4):
print("Iteration through a single list:", lst[x])
輸出:
Iteration through a single list: 10
Iteration through a single list: 2
Iteration through a single list: 0
Iteration through a single list: 1
在這裡,我們將 start
索引作為 0 傳遞給函式,以便它從位置 0 開始從列表中獲取元素序列,即第一個元素。
stop
索引設定為 4,相當於列表長度,因此 range()
函式迭代序列直到最後一個元素並顯示它。
這不是很簡單嗎?而且,如果我們有多個列表要並行迭代?!
好吧,回顧了單個列表的迭代,現在讓我們瞭解迭代兩個 Python 列表的不同方法。
在 Python 中使用 zip()
函式迭代兩個列表
Python zip
函式使我們能夠通過執行迭代兩個或多個列表,直到較小的列表被耗盡。
zip
函式接受多個列表、字串等作為輸入。它一起迭代列表並對映兩個列表/容器的元素以返回一個迭代器物件。
考慮以下場景。
我們在程式碼中指出了兩個迭代列表。我們將列表 list01
和 list02
作為輸入傳遞給 zip()
函式。
zip()
函式然後並行迭代兩個列表,只有 2 次 length(list02)=2
。它以棒狀或元組格式對映兩個列表的元素以返回迭代器物件。
因此,預期的輸出是 1, x
和 2, y
。
這就是我們如何使用 zip()
函式遍歷兩個列表的方法。
import itertools
list01 = [1, 2, 3, 4, 5]
list02 = [10, 20]
for (i,j) in zip(list01, list02):
print (i,j)
輸出:
1 10
2 20
在 Python 中使用 izip()
函式迭代兩個列表
要使用 Python 3.0 之前的版本,我們使用 izip()
函式而不是 zip()
函式來迭代多個列表。
izip()
函式還需要一個容器,例如列表或字串作為輸入。它遍歷列表,直到其中最小的一個被耗盡。
然後它將兩個列表的元素壓縮或對映在一起並返回一個迭代器物件。它返回根據索引對映在一起的兩個列表的元素。
讓我們看看下面的例子。
from itertools import izip
list01 = [1, 2, 3, 4, 5]
list02 = [10, 20]
for (i,j) in izip(list01, list02):
print (i,j)
輸出-
(1, 10)
(2, 20)
我們已經宣告瞭兩個列表,list01
和 list02
,帶有一些資料值。然後我們使用 izip()
函式來遍歷列表。
在這裡,此函式接受兩個列表作為輸入,按位置對映兩個列表的資料元素,然後返回一個迭代器物件,即兩個列表的資料元素的元組。
請注意,對於 Python 3 及更高版本,zip()
函式返回一個迭代器值,而 izip()
函式已過時。因此,Python 2.x 版本中的 izip()
函式類似於 Python 3 及更高版本中的 zip()
函式。
在 Python 中使用 map()
函式迭代兩個列表
除了 zip()
函式之外,Python 還為我們提供了 map()
函式來迭代多個列表,直到所有列表元素都用完。
與 zip()
函式不同,map()
函式不只考慮所有列表中的最小的。相反,它完全解釋了不同長度的列表。
map()
函式接受可迭代的資料結構,例如列表和字串作為輸入以及函式。應用指定的函式後,它對映可迭代的資料元素,並在對映值後返回一個元組。
list01 = [1, 2, 3, 4, 5]
list02 = [10, 20]
for (i,j) in map(None, list01, list02):
print (i,j)
輸出:
(1, 10)
(2, 20)
(3, None)
(4, None)
(5, None)
如上所示,它遍歷整個兩個列表的長度,並將第一個列表的元素對映到另一個列表的元素。
一旦在該位置找不到任何元素,它就會返回一個 None
並將其附加到該位置的對映元素。
例如,map()
函式試圖將 list01
的元素 3 與 list02
的相似索引(位置)處的元素對映。
由於它沒有找到任何元素,它對映並與 None
形成匹配。因此,我們看到了輸出對 (3, None)。
此外,zip()
和 map()
之間的一個顯著區別是,作為 zip()
函式的輸出生成的列表的長度等於最小列表的長度。另一方面,後者不遵循這些標準。
map
函式在 Python 2 中按預期工作。但是,在 Python 3 及更高版本中,我們可以使用 zip_longest
函式來實現相同的結果。
在 Python 中使用 zip_longest()
函式迭代兩個列表
zip_longest()
函式替代了 Python 版本 2 中可用的 map()
函式。它接受可迭代物件,例如列表和字串作為輸入。
它根據索引對映列表的資料值,並返回一個可迭代物件,即對映元素的元組。
類似地,它遍歷兩個列表,直到兩個列表的所有元素都用完。此外,在輸出中,它將 list 01
的一個元素對映到 list 02
的另一個元素。
如果其中一個列表中的元素用盡,它會用 None
替換它們。
參考下面的例子。
import itertools
list01 = [1, 2, 3]
list02 = ['x','y']
for (i,j) in itertools.zip_longest(list01, list02):
print (i,j)
輸出:
1 x
2 y
3 None
在上面的例子中,當迭代迴圈對映兩個列表的第二個元素並移動到第三個元素時,我們看到 list02
,一個包含 2 個元素的列表,被耗盡。
在這種情況下,zip_longest()
函式將等效元素替換並對映為 None
值。