0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

10个Python Itertools,让你的代码如虎添翼

jf_ZqFkd6Up 来源:Linux迷 2023-05-25 09:45 次阅读

Python的美丽在于它的简洁性。

不仅因为Python的语法优雅,还因为它有许多设计良好的内置模块,能够高效地实现常见功能。

itertools模块就是一个很好的例子,它为我们提供了许多强大的工具,可以在更短的代码中操作Python的可迭代对象。

用更少的代码实现更多的功能,这就是你可以从itertools模块中获得的好处。让我们从本文中了解一下。

1、itertools.product(): 避免嵌套循环的巧妙方法

当程序变得越来越复杂时,你可能需要编写嵌套循环。同时,你的Python代码将变得丑陋和难以阅读:


list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]


for a in list_a:
    for b in list_b:
        for c in list_c:
            if a + b + c == 2077:
                print(a, b, c)
# 70 2000 7
c654f4be-fa29-11ed-90ce-dac502259ad0.png

如何使上述代码再次具有 Python 风格?

那 itertools.product() 函数就是你的朋友:

from itertools import product


list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]


for a, b, c in product(list_a, list_b, list_c):
    if a + b + c == 2077:
        print(a, b, c)
# 70 2000 7


如上所示,它返回输入可迭代对象的笛卡尔积,帮助我们将三个嵌套的for循环合并为一个。

2、itertools.compress(): 过滤数据的便捷方式

我们可以通过一个或多个循环来筛选列表中的项。

但有时候,我们可能不需要编写任何循环。因为有一个名为itertools.compress()的函数。

itertools.compress()函数返回一个迭代器,根据相应的布尔掩码对可迭代对象进行过滤。

例如,以下代码使用itertools.compress()函数选择出真正的领导者:

import itertools
leaders = ['Yang', 'Elon', 'Tim', 'Tom', 'Mark']
selector = [1, 1, 0, 0, 0]
print(list(itertools.compress(leaders, selector)))
# ['Yang', 'Elon']
c6616492-fa29-11ed-90ce-dac502259ad0.png


第二个参数selector作为掩码起作用,我们也可以这样定义它:

selector = [True, True, False, False, False]

3、itertools.groupby(): 对可迭代对象进行分组

itertools.groupby()函数是一种方便的方式,用于将可迭代对象中相邻的重复项进行分组。

例如,我们可以将一个长字符串进行分组,如下所示:


from itertools import groupby


for key, group in groupby('LinnuxmiMi'):
    print(key, list(group))
c6681238-fa29-11ed-90ce-dac502259ad0.png

此外,我们可以利用它的第二个参数告诉groupby()函数如何确定两个项是否相同:

from itertools import groupby


for key, group in groupby('LinnuxmiMi', lambda x: x.upper()):
    print(key, list(group))



4、itertools.combinations(): 从可迭代对象中获取给定长度的所有组合

对于初学者来说,编写一个无 bug 的函数来获取列表的所有可能组合可能需要一些时间。

事实上,如果她了解 itertools.combinations() 函数,她可以很容易地实现:


import itertools


author = ['L', 'i', 'n', 'u', 'x']


result = itertools.combinations(author, 2)


for a in result:
    print(a)
c66e35fa-fa29-11ed-90ce-dac502259ad0.png

如上所示,itertools.combinations()函数有两个参数,一个是原始可迭代对象,另一个是函数生成的子序列的长度。

5、itertools.permutations(): 从可迭代对象中获取给定长度的所有排列

既然有一个函数可以获取所有组合,当然也有另一个名为itertools.permutations的函数来获取所有可能的排列:


import itertools


author = ['Y', 'a', 'n', 'g']


result = itertools.permutations(author, 2)


for x in result:
    print(x)


# ('Y', 'a')
# ('Y', 'n')
# ('Y', 'g')
# ('a', 'Y')
# ('a', 'n')
# ('a', 'g')
# ('n', 'Y')
# ('n', 'a')
# ('n', 'g')
# ('g', 'Y')
# ('g', 'a')
# ('g', 'n')


如上所示,itertools.permutations()函数的用法与itertools.combinations()类似。唯一的区别在于它们的结果。

6、itertools.accumulate(): 从可迭代对象生成累积的项

基于可迭代对象获取一系列累积值是一种常见需求。借助itertools.accumulate()函数的帮助,我们无需编写任何循环即可实现。


import itertools
import operator


nums = [1, 2, 3, 4, 5]
print(list(itertools.accumulate(nums, operator.mul)))
# [1, 2, 6, 24, 120]
如果我们不想使用operator.mul,上述程序可以改写如下:

import itertools


nums = [1, 2, 3, 4, 5]
print(list(itertools.accumulate(nums, lambda a, b: a * b)))
# [1, 2, 6, 24, 120]

7、itertools.repeat(), itertools.cycle(), itertools.count(): 生成无限迭代对象

在某些情况下,我们需要获得无限迭代。有 3 个有用的功能:

itertools.repeat():重复生成相同的项

例如,我们可以得到三个相同的“Yang”,如下所示:


import itertools
print(list(itertools.repeat('Yang', 3)))
# ['Yang', 'Yang', 'Yang']


itertools.cycle(): 通过循环获得无限迭代器

itertools.cycle函数将不会停止,直到我们跳出循环:


import itertools


count = 0


for c in itertools.cycle('Yang'):
    if count >= 12:
        break
    else:
        print(c, end=',')
        count += 1
# Y,a,n,g,Y,a,n,g,Y,a,n,g,
itertools.count(): 生成一个无限的数字序列 如果我们只需要数字,可以使用itertools.count函数:

import itertools


for i in itertools.count(0, 2):
    if i == 20:
        break
    else:
        print(i, end=" ")
# 0 2 4 6 8 10 12 14 16 18


如上所示,它的第一个参数是起始数字,第二个参数是步长。

8、itertools.pairwise(): 轻松获取成对的元组

自从Python 3.10版本开始,itertools模块新增了一个名为pairwise的函数。它是一个简洁而方便的工具,用于从可迭代对象中生成连续的重叠对。


import itertools


letters = ['a', 'b', 'c', 'd', 'e']


result = itertools.pairwise(letters)


print(list(result))
# [('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e')]
c67406ce-fa29-11ed-90ce-dac502259ad0.png

9、itertools.takewhile(): 以不同的方式过滤元素

itertools.takewhile()返回一个迭代器,只要给定的谓词函数评估为True,就会从可迭代对象中生成元素。


import itertools


nums = [1, 61, 7, 9, 2077]


print(list(itertools.takewhile(lambda x: x < 100, nums)))
# [1, 61, 7, 9]
该函数与内置的filter()函数不同。

filter函数将遍历整个列表:

nums = [1, 61, 7, 9, 2077]


print(list(filter(lambda x: x < 10, nums)))
# [1, 7, 9]
然而,itertools.takewhile函数如其名称所示,当评估函数为False时会停止迭代:

import itertools


nums = [1, 61, 7, 9, 2077]


print(list(itertools.takewhile(lambda x: x < 10, nums)))
# [1]

10、itertools.dropwhile(): itertools.takewhile的反向操作

这个函数似乎是前面那个函数的相反思路。

itertools.takewhile()函数在谓词函数为True时返回可迭代对象的元素,而itertools.dropwhile()函数在谓词函数为True时丢弃可迭代对象的元素,然后返回剩下的元素。


import itertools


nums = [1, 61, 7, 9, 2077]


print(list(itertools.dropwhile(lambda x: x < 100, nums)))
# [2077]

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10992

    浏览量

    206744
  • 函数
    +关注

    关注

    3

    文章

    3904

    浏览量

    61310
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66814
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476

原文标题:10 个 Python Itertools,让你的代码如虎添翼

文章出处:【微信号:Linux迷,微信公众号:Linux迷】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    35有关Python的小技巧

    一部分的公开亮相。如果已经是python大牛,那么基本上应该知道这里面的大多数用法了,但我想你应该也能发现一些不知道的新技巧。而如果
    发表于 02-22 20:23

    Python面试必看的10问题

    :delaelse:last=aprint(a)10、下面的代码Python2中的输出是什么?解释的答案defdiv1(x,y): print "%s/%s = %s" % (x
    发表于 02-28 17:00

    10Python工程师必知开发工具盘点

    python-mode提供了开箱即用的python。Emacs可以通过额外的扩展包来增加更多的高级功能。以上提到的IDE各有各的风格,但都试图达到一共同的要求,即快速开发可扩展性和可管理代码
    发表于 06-14 17:01

    快速学习Python的技巧

    )有很多老的Python排序代码,它们在你创建一自定义的排序时花费的时间,但在运行时确实能加速执行排序过程。元素排序的最好方法是尽可能使用键(key)和默认的sort()排序方法。
    发表于 07-27 14:58

    Labview与Python的网络编程

    Labview素有测试之王的美誉,图形化编程和快速搭建自动化平台人爱不释手。但是Labview不能在安卓平台上运行,开发web也力不从心。如果labview配合上Python简直就如虎添翼
    发表于 11-12 13:48

    10Python功力,总结了10开发技巧,非常实用

    read 函数,其实 Python 会将文件的内容一次性的全部载入内存中,如果文件有 10 G甚至更多,那么的电脑就要消耗的内存非常巨大。# 一次性读取with open(&qu
    发表于 08-26 11:58

    python合并字典的 7 种方法

    ;, "male"))){'name': 'xiaoming', 'age': 27, 'gender': 'male'}3、借助 itertoolsPython 里有一非常强大的内置
    发表于 04-08 15:11

    Python系统库itertools的详细资料介绍

    很多人都致力于把Python代码写得更Pythonic,一来更符合规范且容易阅读,二来一般Pythonic的代码在执行上也更有效率。今天就先给大家介绍一下Python的系统库
    的头像 发表于 06-18 17:08 2950次阅读

    python代码示例之基于Python的日历api调用代码实例

    本文档的主要内容详细介绍的是python代码示例之基于Python的日历api调用代码实例。
    发表于 09-06 14:25 42次下载
    <b class='flag-5'>python</b><b class='flag-5'>代码</b>示例之基于<b class='flag-5'>Python</b>的日历api调用<b class='flag-5'>代码</b>实例

    10种聚类介绍和Python代码

    分享一篇关于聚类的文章,10种聚类介绍和Python代码
    的头像 发表于 07-30 10:25 1516次阅读

    10种顶流聚类算法Python实现(附完整代码

    分享一篇关于聚类的文章:10种聚类算法和Python代码
    的头像 发表于 01-07 09:33 831次阅读

    10种聚类算法和Python代码1

    分享一篇关于聚类的文章: **10种聚类算法和Python代码** 。文末提供`jupyter notebook`的完整代码获取方式。 聚类或聚类分析是
    的头像 发表于 02-20 13:57 548次阅读
    <b class='flag-5'>10</b>种聚类算法和<b class='flag-5'>Python</b><b class='flag-5'>代码</b>1

    10种聚类算法和Python代码2

    分享一篇关于聚类的文章: **10种聚类算法和Python代码** 。文末提供`jupyter notebook`的完整代码获取方式。 聚类或聚类分析是
    的头像 发表于 02-20 13:57 690次阅读
    <b class='flag-5'>10</b>种聚类算法和<b class='flag-5'>Python</b><b class='flag-5'>代码</b>2

    10种聚类算法和Python代码3

    分享一篇关于聚类的文章: **10种聚类算法和Python代码** 。文末提供`jupyter notebook`的完整代码获取方式。 聚类或聚类分析是
    的头像 发表于 02-20 13:57 851次阅读
    <b class='flag-5'>10</b>种聚类算法和<b class='flag-5'>Python</b><b class='flag-5'>代码</b>3

    10种聚类算法和Python代码4

    分享一篇关于聚类的文章: **10种聚类算法和Python代码** 。文末提供`jupyter notebook`的完整代码获取方式。 聚类或聚类分析是
    的头像 发表于 02-20 13:57 1002次阅读
    <b class='flag-5'>10</b>种聚类算法和<b class='flag-5'>Python</b><b class='flag-5'>代码</b>4