【Python】关于Python Itertools 后悔没有早点了解的九个函数

文摘   科技   2024-11-13 16:41   江苏  








01


引言





大家好,我是AI算法之道!


Python是我最喜欢的编程语言之一,它向来以其简单性、多功能性和可读性而闻名。



大家好!今天我想与大家分享Python3中的Itertools 模块,其主要功能是用来做惰性序列的对象,只有当迭代到某个值的时候,才会进行计算得出这个值。

闲话少说,我们直接开始吧!






02


itertools.pairwise


itertools.pairwise 允许我们生成某个可迭代项中的每一对相邻项。
您是否曾经需要比较某个列表中的每一对数据,并为此编写了 for 循环逻辑?

itertools.pairwise 本质上就是为我们做这件事,我们不再需要自己实现这个逻辑。现在,我们的代码看起来更整洁、更易读了。




03


 itertools.product


itertools.product 允许我们将多嵌套 for 循环浓缩为一个循环。
通常的做法是使用 for 循环:

在使用 itertools.product时,我们可以将代码进行简化:

这个功能与上面的功能完全相同,但更加优雅,也更易于人阅读。





04


 permutations & combinations


itertools.permutations 允许我们生成某个列表或可迭代项的所有排列组合:

我们还可以输入所需的排列长度,例如,生成长度为 2 的所有排列(而不是默认的 3)。

itertools.combinations 允许我们生成某个 list 或 iterable 的所有组合

就上下文而言,组合是一种排列顺序无关紧要的排列。两个排列(1,3,2)和(1,2,3)由于顺序不同而被认为是不同的。相反,(1、3、2)和(1、2、3)这两个组合被认为是完全相同的,因为在组合中顺序并不重要。

例如,从列表 [1, 2, 3, 4] 中生成所有长度为 3 的组合:





05


Combinations with replacement


itertools.combinations 中,每个元素只能使用一次。

itertools.combinations_with_replacement 中,每个元素都可以重复使用。

使用 itertools.combinations 从 [1, 2, 3] 中生成长度为 2 的所有组合:


使用 itertools.combinations_with_replacement 代替--现在请注意,每个单独的元素都可以使用多次。









06


itertools.zip_longest

itertools.zip_longest 允许我们同时遍历 2 个或多个可遍历项(列表、二进制数等),并仅在最长的可遍历项结束后停止。

解释如下:
  • fruit 有 3 个元素,而 price 有 5 个元素
  • itertools.zip_longest 仅在最长迭代停止时停止
  • 在这种情况下,我们在迭代 5 次时停止
  • 对于缺失的fruit,将直接生成None
相反,如果我们使用默认的内置 zip() 函数,则会在最短可迭代次数结束时停止迭代。

我们可以使用 zip() itertools.zip_longest,这取决于我们的用例。







07


itertools.cycle


itertools.cycle 允许我们永远重复某个元素序列。比方说,我们想永远按照这个顺序生成apple、orange和pear。我们可以使用 while 循环来实现。

或者,我们也可以使用 itertools.cycle 来实现:
这样,我们的代码看起来更整洁,更易于阅读,我们也不需要手动实现 while 循环逻辑。






08


itertools.groupby


itertools.groupby 为我们提供了迭代的功能,同时还能将相似的元素分组。


一个简单的例子--相同的元素被组合在一起:


注:相互独立的 1 被视为不同的组。


如果输入参数 key,我们就可以自定义 itertools.groupby 如何将元素分组。


例如,让我们按最后一位数字将数字分组--要做到这一点,我们需要在 key 参数中传递一个 lambda 函数。


注意到最后一位数相同的数字现在被组合在一起了。









09


itertools.accumulate


itertools.accumulate 为我们提供了对可迭代表中的所有元素进行累加操作的功能。


如果我们没有为 itertools.accumulate 提供操作,它默认为加法。

给定列表 [1,5,3,2]:

  • 我们的第一个元素是 1
  • 我们的第二个元素是 (1 + 5) = 6
  • 我们的第三个元素是 (1 + 5 + 3) = 9
  • 最后一个元素是 (1 + 5 + 3 + 2) = 11


我们还可以选择将自定义操作传入 itertools.accumulate。例如,与其做加法,不如做减法:








10


itertools.count


itertools.count 允许我们创建无限的范围,如下:

与内置 range 函数不同,itertools.count 可以创建一个无限的范围。

我们甚至可以用step等于负数来代替:









点击上方小卡片关注我




添加个人微信,进专属粉丝群!

AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
 最新文章