在 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
值。