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

    文章

    11225

    浏览量

    208912
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62427
  • 代码
    +关注

    关注

    30

    文章

    4744

    浏览量

    68345
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84449

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

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

收藏 人收藏

    评论

    相关推荐

    10杀手级的Python自动化脚本

    今天浩道跟大家分享10日常工作中用到的python自动化脚本。感受一番python简单强大
    发表于 11-28 11:07 671次阅读

    Python面试必看的10问题

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

    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 代码优雅又地道

    Python社区文化的浇灌下,演化出了一种独特的代码风格,去指导如何正确地使用Python,这就是常说的pythonic。一般说地道(idiomatic)的python
    的头像 发表于 03-06 10:35 3594次阅读

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

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

    7Python调试通过的代码详细资料分析

    "Python的应用十分广泛,今天我们来分享7Python实战项目代码,希望你有所收获。
    的头像 发表于 10-14 09:46 3428次阅读

    Python 代码加速运行的的小技巧

    的技巧进行整理。 0. 代码优化原则本文会介绍不少的 Python 代码加速运行的技巧。在深入代码优化细节之前,需要了解一些代码优化基本原则
    的头像 发表于 09-01 11:28 1688次阅读

    一些值得玩味的python代码

    选取了 6 自己认为值得玩味的 python 代码,希望对正在学习 python有所帮助。
    的头像 发表于 03-30 17:32 1674次阅读

    10种聚类介绍和Python代码

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

    20解决日常问题的Python代码片段!

    在本文中,将分享20 Python 代码片段,以帮助你应对日常编程挑战。可能已经知道其中一些片段,但有些其他片段对来说可能是新的。赶
    的头像 发表于 03-13 09:40 980次阅读

    深度学习如何Turing 显卡如虎添翼

    NVIDIA 首席执行官畅谈深度学习 Turing 显卡如虎添翼
    的头像 发表于 08-01 14:55 557次阅读

    Yapf:一格式化 Python 代码的好帮手

    格式化为符合 PEP8 代码指南的格式,还能格式化为符合 Google 代码指南的格式,可选项更多,代码更加漂亮。 1.准备 开始之前
    的头像 发表于 10-17 11:08 775次阅读
    Yapf:一<b class='flag-5'>个</b>格式化 <b class='flag-5'>Python</b> <b class='flag-5'>代码</b>的好帮手

    python代码写完后点哪个运行

    或命令行界面,输入命令 python ,然后将你的代码粘贴到解释器提示符 >>> 后面,按下回车即可运行代码。 集成开发环境(IDE):IDE是一种提供代码编辑、调试、运行等功能的开发
    的头像 发表于 11-24 09:28 5222次阅读

    python软件怎么运行代码

    Python是一种高级编程语言,它被广泛用于开发各种类型的应用程序,从简单的脚本到复杂的网络应用和机器学习模型。要运行Python代码,您需要一P
    的头像 发表于 11-28 16:02 861次阅读