在 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