在 Python 中遍歷兩個列表

Safa Anees Mulani 2023年1月30日
  1. 在 Python 中遍歷兩個列表
  2. 在 Python 中使用 zip() 函式迭代兩個列表
  3. 在 Python 中使用 izip() 函式迭代兩個列表
  4. 在 Python 中使用 map() 函式迭代兩個列表
  5. 在 Python 中使用 zip_longest() 函式迭代兩個列表
在 Python 中遍歷兩個列表

在解析儲存在字典、元組、列表等資料結構中的資料時,我們會遇到迭代以移動儲存在其中的資料序列。

在 Python 中迭代單個資料結構(如列表)是很常見的,但是如果我們遇到期望我們一起迭代兩個/多個列表的場景怎麼辦?

本文將通過一些演示揭示在 Python 中迭代兩個列表的不同方法。

在 Python 中遍歷兩個列表

我們可以使用 for 迴圈或 range() 函式遍歷單個 Python 列表。

range(start, stop, step) 函式使我們能夠從定義的值範圍中獲取一系列數字。它接受 startstopstep 作為輸入。

其中,

  • 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 函式接受多個列表、字串等作為輸入。它一起迭代列表並對映兩個列表/容器的元素以返回一個迭代器物件。

考慮以下場景。

我們在程式碼中指出了兩個迭代列表。我們將列表 list01list02 作為輸入傳遞給 zip() 函式。

zip() 函式然後並行迭代兩個列表,只有 2 次 length(list02)=2。它以棒狀或元組格式對映兩個列表的元素以返回迭代器物件。

因此,預期的輸出是 1, x2, 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)

我們已經宣告瞭兩個列表,list01list02,帶有一些資料值。然後我們使用 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 值。

相關文章 - Python List