Python:itertools模块使用说明

本贴最后更新于 4301 天前,其中的信息可能已经时移世改

itertools模块为python2.6之后引入的,包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用。

In [1]: from itertools import *
#用xrange创建长度10000,元素均为0的列表
In [2]: timeit [0 for i in xrange(10000)]
1000 loops, best of 3: 404 us per loop
#用itertools创建长度10000,元素均为0的列表,性能明显提高。原因是迭代器创建列表对象是一次性分配完内存
In [3]: timeit list(repeat(0,10000))
10000 loops, best of 3: 75.8 us per loop
#连接两个列表
In [4]: it=chain(xrange(5),"abc")

In [5]: list(it)
Out[5]: [0, 1, 2, 3, 4, 'a', 'b', 'c']
#对列表进行排序组合,无序
In [6]:list(combinations("abcd",2))
Out[6]: [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
#对列表进行排序组合,有序
In [7]:list(permutations("abcd",2))
Out[7]: [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
#对列表进行排序组合,包括同一元素自身的组合
In [8]: it=combinations_with_replacement("abcd",2)
In [9]: list(it)
Out[9]: [('a', 'a'),
('a', 'b'),
('a', 'c'),
('a', 'd'),
('b', 'b'),
('b', 'c'),
('b', 'd'),
('c', 'c'),
('c', 'd'),
('d', 'd')]
#按条件过滤迭代器
In [10]: it=compress("abcde",[True,False,True])
In [11]: list(it)
Out[11]: ['a', 'c']
#ifilter(predicate, iterable) 创建一个迭代器,仅生成 iterable 中 predicate(item)为 True 的项,如果 predicate 为 None,将返回 iterable 中所有计算为 True 的项。
In [18]: list(ifilter(lambda x: x%2, range(10)))
Out[18]: [1, 3, 5, 7, 9]
#ifilterfalse(predicate, iterable):创建一个迭代器,仅生成 iterable 中 predicate(item)为 False 的项,如果 predicate 为 None,则返回 iterable 中所有计算为 False 的项。
In [19]: list(ifilterfalse(lambda x: x%2, range(10)))
Out[19]: [0, 2, 4, 6, 8]
#dropwhile(predicate, iterable):
#创建一个迭代器,只要函数 predicate(item)为 True,就丢弃 iterable 中的项,如果 predicate 返回 False,就会生成 iterable 中的项和所有后续项。
In [20]: list(dropwhile(lambda x: x<5, [1,4,6,4,1]))
Out[20]: [6, 4, 1]
#takewhile(predicate [, iterable]):
#创建一个迭代器,生成 iterable 中 predicate(item)为 True 的项,只要 predicate 计算为 False,迭代就会立即停止。
In [21]: list(takewhile(lambda x: x<5, [1,4,6,4,1]))
Out[21]: [1, 4]
#chain.from_iterable(iterables):
#一个备用链构造函数,其中的 iterables 是一个迭代变量,生成迭代序列,此操作的结果与以下生成器代码片段生成的结果相同:
In [22]: test = chain.from_iterable('ABCDEF')
In [23]: test.next()
Out[23]: 'A'
In [24]: test.next()
Out[24]: 'B'
#count([n]):
#创建一个迭代器,生成从 n 开始的连续整数,如果忽略 n,则从 0 开始计算(注意:此迭代器不支持长整数),如果超出了 sys.maxint,计数器将溢出并继续从-sys.maxint-1 开始计算。
In [30]: test=count(10000)
In [31]: test.next()
Out[31]: 10000
In [32]: test.next()
Out[32]: 10001
In [33]: test.next()
Out[33]: 10002
In [34]: test.next()
Out[34]: 10003
#cycle(iterable):
#创建一个迭代器,对 iterable 中的元素反复执行循环操作,内部会生成 iterable 中的元素的一个副本,此副本用于返回循环中的重复项。
In [49]: test=cycle(range(3))
In [50]: test.next()
Out[50]: 0
In [51]: test.next()
Out[51]: 1
In [52]: test.next()
Out[52]: 2
In [53]: test.next()
Out[53]: 0
In [54]: test.next()
Out[54]: 1
#islice(iterable, [start, ] stop [, step]):
#创建一个迭代器,生成项的方式类似于切片返回值: iterable[start : stop : step],将跳过前 start 个项,迭代在 stop 所指定的位置停止,step 指定用于跳过项的步幅。与切片不同,负值不会用于任何 start,stop 和 step,如果省略了 start,迭代将从 0 开始,如果省略了 step,步幅将采用 1.
In [1]: from itertools import *
In [2]: list(islice('ABCDEFG', 2))
Out[2]: ['A', 'B']
In [3]: list(islice('ABCDEFG', 2, 4))
Out[3]: ['C', 'D']
In [4]: list(islice('ABCDEFG', 2, None))
Out[4]: ['C', 'D', 'E', 'F', 'G']
In [5]: list(islice('ABCDEFG', 2, None,2))
Out[5]: ['C', 'E', 'G']
#izip(iter1, iter2, ... iterN):
#创建一个迭代器,生成元组(i1, i2, ... iN),其中 i1,i2 ... iN 分别来自迭代器 iter1,iter2 ... iterN,只要提供的某个迭代器不再生成值,迭代就会停止,此函数生成的值与内置的 zip()函数相同。
In [7]: list(izip('ABCD', 'xy'))
Out[7]: [('A', 'x'), ('B', 'y')]
#izip_longest(iter1, iter2, ... iterN, [fillvalue=None]):
#与 izip()相同,但是迭代过程会持续到所有输入迭代变量 iter1,iter2 等都耗尽为止,如果没有使用 fillvalue 关键字参数指定不同的值,则使用 None 来填充已经使用的迭代变量的值。
In [8]: list(izip_longest('ABCD', 'xy', fillvalue='-'))
Out[8]: [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')]
#product(iter1, iter2, ... iterN, [repeat=1]):
#创建一个迭代器,生成表示 item1,item2 等中的项目的笛卡尔积的元组,repeat 是一个关键字参数,指定重复生成序列的次数
In [11]: list(product('ABCD', 'xy'))
Out[11]:
[('A', 'x'),
('A', 'y'),
('B', 'x'),
('B', 'y'),
('C', 'x'),
('C', 'y'),
('D', 'x'),
('D', 'y')]
In [13]: list(product(range(2), repeat=3))
Out[13]:
[(0, 0, 0),
(0, 0, 1),
(0, 1, 0),
(0, 1, 1),
(1, 0, 0),
(1, 0, 1),
(1, 1, 0),
(1, 1, 1)]

  

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    87 引用 • 139 回帖 • 1 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 1 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 487 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 7 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 55 关注
  • abitmean

    有点意思就行了

    30 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 546 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 804 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 1 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖 • 1 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 617 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 735 关注
  • Outlook
    1 引用 • 5 回帖 • 3 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 319 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖 • 4 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 7 关注