使用Python Itertools有效地进行迭代

Itertools是一个Python模块,其中包含一组工具,可用来构建复杂的自定义迭代器以完全适合您的应用程序。但是首先,我们需要知道什么是迭代器。我们来看一下。

在本教程结束时,您将了解以下内容:

  • 迭代器与可迭代对象之间的区别
  • Itertools模块的优势
  • itertools模块中的各种功能
  • 使用示例的代码

什么是迭代器和可迭代的?

对于Python,Iterator和Iterables在含义上有明显的区别。简单来说,可迭代对象是可以对其进行迭代的对象。例如,列表,元组和字典是Python的内置可迭代容器数据类型。 

因此,当我们要迭代这些可迭代对象时,我们将编写“ for循环”或列表/字典理解。有了这些,Python在内部创建了我们所谓的迭代器,它本质上负责“迭代”。 

严格来说,可迭代对象是包含__iter__方法的对象,该方法返回迭代器。现在,要迭代可迭代对象,迭代器具有__next__方法,该方法负责从可迭代对象中获取下一项并跟踪索引。

AI Time Journal资源
您正在学习数据科学吗?

Check out what 图书 帮助20多个成功的数据科学家成长。

什么是Itertools模块?

Itertools中的“ Iter”代表Iterables。 蟒蛇中的itertools模块提供了一组针对特定任务而设计的工具或函数,但也可以组合使用以构建更复杂的迭代器。

您可以将它们视为高效功能的一部分,这使我们的生活变得轻松,因为我们不必手动编写常见和重复任务的功能。 当您将其中一些用于用例时,也可以将它们用作“迭代器代数”。

因此,使用这些功能,您可以创建干净,高效和智能的代码,而不必创建凌乱且效率较低的代码。

Itertools功能

现在,让我们看一下它所具有的功能,以便您可以真正欣赏它的存在,并将itertools纳入您的日常编码和竞争性编码中!

在使用第一个函数之前,让我们看一下Python中的zip()函数,它不是itertools模块的一部分,而是一个非常智能且方便的迭代器。 

Zip函数采用多个可迭代对象(如列表,元组或字典),然后对所有这些可迭代对象进行并行迭代。也就是说,您可以对所有这些可迭代对象的相同索引的元素执行相同的操作。 

a = [1, 2, 3]
b = [4, 5, 6]
c = []
for x,y in zip(a,b):
    c.append(x+y)
print(c)

#输出:
>> [5, 7, 9]

如您所见,zip函数实际上是 拉链 这两个列表并以相同的索引对元素进行操作。但是,如果列表中的元素数不相同怎么办?

输入zip_longest。

zip_longest()

zip_longest()是itertools模块的功能,可让您在压缩时使用多个不同大小的可迭代对象。使用zip时,将考虑最短长度的可迭代对象,而忽略所有其他可迭代对象的其余元素。让我们看看如何使用zip_longest解决这个问题。

a = [1, 2, 3]
b = [4, 5, 6, 7, 8]
c = []
for x,y in zip(a,b):
    c.append(x+y)
print(c)

#输出:[5、7、9]

你看到了吗?它忽略了值7和8。

现在,让我们看看zip_longest的工作原理。

from itertools import zip_longest

a = ['A', 'B', 'C']
b = ['4', '5', '6', '7', '8', '9']
c = []

for x,y in zip_longest(a,b, fillvalue = 'X'):
    c.append(x+y)
print(c)

#输出:
>> [‘A4’, ‘B5’, ‘C6’, ‘X7’, ‘X8’, ‘X9’]

因此需要传递参数fill值,以指定您需要Python用哪个值来填充较短的可迭代对象。

积累()

该accumulate()函数接受一个可迭代对象,该函数对可迭代对象的元素执行一些操作。然后将结果累加并进行运算。听起来令人困惑?让我们看一下代码。

from itertools import accumulate
from operator import mul

A = [1, 2, 3, 4, 5]
print(list(accumulate(A, mul)))

#输出:
>> [1, 2, 6, 24, 120]

因此从运算符模块中将列表A和一个函数乘以两个数字。然后以以下方式迭代并产生输出:

  1. 1是第一个元素,因此也是1
  2. 1乘2是2
  3. 2乘3是6
  4. 6乘4是24
  5. 24乘5是120

看看它如何累积输出?默认功能是-sum。因此,如果您不传递任何函数,则默认情况下,累加将给出累加的总和。您也可以编写自己的自定义函数,该函数接受2个输入并对其进行操作。此外,您还可以直接传递lambda函数。

filterfalse()

filterfalse函数的功能与它的名称完全相同,它会过滤某些条件下为false的元素。也就是说,只有不符合条件的元素才会出现在输出中。

from itertools import filterfalse
A = range(10)
print(list(filterfalse(lambda x: x%2==0, A)))

#输出:
>> [1, 3, 5, 7, 9]

如您所见,我们的条件检查偶数。而filterfalse仅给出条件为false的输出。

starmap()

Starmap函数创建一个迭代器,该迭代器接受一个函数和一个其中带有可迭代项的可迭代项作为参数。然后,就像地图功能一样,将该功能应用于内部的可迭代对象。

从字面上看,地图和星图之间的区别是“星”。这颗星做什么?

答:开箱。

本质上,要应用map函数,传递给它的参数一定不能是容器类型本身。让我们通过一个例子来理解这一点。

lis = [(2, 2), (3, 2), (4, 2)]
print(list(map(pow, lis)))

上面的代码尝试映射函数pow,该函数使用2个参数x和y并返回x ** y。但是,上面的代码将一个元组(2,2)作为参数,而又不知道另一个参数,则会引发错误。

#输出:
>>TypeError:pow至少需要2个参数,得到1

这是星图派上用场的地方。它在列表中包含元组并将其解包。

from itertools import starmap
lis = [(2, 2), (3, 2), (4, 2)]
print(list(starmap(pow, lis)))

#输出:
>> [4, 9, 16]

它按照我们想要的那样工作。所以,正如我前面提到的,map函数是这样的–function(a,b),而星图是一个function(* c)。其中*用于解包外部列表中的可迭代对象。

除了这些迭代器功能之外,Iterto.5.5ols还具有其他功能,例如chain(),chain.from iterable(),groupby(),islice(),compress(),dropwhile(),takewhile()和tee()。

无限迭代器

itertools模块还具有一组迭代器,这些迭代器可以生成值,直到它们被中断为止。这些不会检查您的RAM,因为它一次生成一个值,并且不会一次处理所有值。这意味着它可以成功生成无限的数据流。让我们快速浏览以下内容:

计数(开始,步进) 从start参数开始生成数字,直到无穷大为止,并由step参数定义增量。

for i in itertools.count(1,2):
    print(i)

#输出:
>> 1 3 5 7…

周期(arg) 返回所传递参数的无限循环。

for i in itertools.cycle(‘ABC’):
    print(i)

#输出:
>> ABC ABC ABC ABC ABC…

重复(元素,数字) 返回元素指定次数。

for i in itertools.repeat(10, 4):
    print(i)

#输出:
>> 10 10 10 10

组合迭代器

除上述迭代器外,Itertools还提供一些功能,这些功能可生成所提供输入的排列和组合。这些在竞争性编程中也非常有用。重复指定组合的长度。

product('AB', repeat=2)
#>> (AA, AB, BA, BB)
permutations('ABC', 2)
#>> (AB, AC, BA, BC, CA, CB)
combinations('ABC', 2)
#>> (AB, AC, BC)
combinations_with_replacement('ABC', 2)
#>> (AA, AB, AC, BB, BC, CC)

你走之前

本教程就是这样。您可以练习这些示例,查看功能如何工作,然后实现更复杂的示例以更好地掌握这些示例。 Itertools显然是要变得更好的Python上最方便,最关键的优势之一。

编辑助理

茶yan 是一位注重细节的创意数据科学家。他是每天的学习者和博客作者,非常渴望分享知识并支持数据科学社区。与他联系 领英 联系并不要’别忘了检查他的 博客。

数据科学|机器学习|写博客– Author @ 中

关于Chayan Kathuria

茶yan 是一位注重细节的创意数据科学家。他是每天的学习者和博客作者,非常渴望分享知识并支持数据科学社区。与他联系 领英 保持联系,不要忘记签出他的 博客。 数据科学|机器学习|写博客- Author @ 中

查看Chayan Kathuria发表的所有帖子→