itertools提供的工具快速且高效,为了提升代码质量及避免重复造轮子,有必要学习下。

无限迭代器

count(start=0, step=1)

count迭代器以start为起点(默认0),step为间隔(默认1)返回相应的值:

from itertools import count

for i in count(10,2):

if i > 20:

break

else:

print i,

输出:

10 12 14 16 18 20

除了手动添加break跳出循环外,另外一种方式,使用islice,islice实为对迭代器作分割,可以指定迭代器的起始和终止参数。

from itertools import count, islice

for i in islice(count(10,2),8):  # 指定迭代到第8个

print i,

输出:

10 12 14 16 18 20 22 24

for i in islice(count(10,2),3,8):  # 指定从第3个迭代到第8个

print i,

输出:

16 18 20 22 24

cycle(iterable)

cycle迭代器可以在一系列数据中无限循环

for i in islice(cycle('zxw'),8):

print i,

输出:

z x w z x w z x

for i in islice(cycle(['zxw', 'dj']),8):

print i,

输出:

zxw dj zxw dj zxw dj zxw dj

# 可以使用Python内置的next去依次遍历由itertools产生的迭代器:

rgb = ['red', 'green', 'blue']

it = cycle(rgb)

next()  # 'red'

next()  # 'green'

...

repeat(object[,times])

repeat会无限次地返回object,除非指定times,会在达到times次的迭代时抛出StopIteration异常。

from itertools import repeat

it = repeat('zxw', 3)

print next(it),next(it),next(it)

输出:

zxw zxw zxw

会终止的迭代器

Accumulate(iterable[,func])  (python3.2)

根据func进行累计运算,默认为加法。

>> from itertools import accumulate

>>> list(accumulate(range(10)))  # 使用list返回列表,否则为迭代器

[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

chain(*iterables)

chain迭代器接收一系列可迭代对象并将其组合成一个,虽然可以用加法或extend代替,但这种方式更加优雅易懂。

from itertools import chain

a = [1,2,3,4]

b = [5,6,7,8]

c = [9,0]

print list(chain(a,b,c))                     # [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

print list(chain.from_iterable([a,b,c]))     # 与上面等效, [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

compress(data,selectors)

compress接收两个参数,使用selectors过滤data,一般selectors为bool类型列表,或者是0,1。

from itertools import compress

a = [1,2,3,4]

b = [1,0,1]

print list(compress(a,b))  # [1,3]

print list(compress(b,a))  # [1,0,1]

dropwhile(predicate,iterable),takewhile(predicate,iterable)

dropwhile使用predicate依次遍历iterable,当遇到第一个False时,返回包括该元素在内的剩下的元素列表。

from itertools import dropwhile

a = [1,2,3,4,3,2,1]

print list(dropwhile(lambda x: x

print list(takewhile(lambda x: x

ifilterfalse(predicate,iterable)

filterfalse会用predicate遍历iterable中的所有元素,返回验证为False的元素列表。个人认为,对于简单的predicate,可以用列表推导代替,更加简单。

from itertools import ifilterfalse

a = [1,2,3,4,3,2,1]

print list(ifilterfalse(lambda x: x

print [i for i in a if not i

groupby(iterable, key=None)

groupby默认使用iterable中的当前元素作为分组的key,也可以自定义。groupby只能对序列中连续的元素进行分组。

b = [1,2,3,3,3,4,4,5,3,3]

for key, group in groupby(b):

print 'group start, key:%s' % key

for v in group:

print v

print 'group end'

输出:

group start, key:1

1 group end

group start, key:2

2 group end

group start, key:3

3 3 3 group end

group start, key:4

4 4 group end

group start, key:5

5 group end

group start, key:3

3 3 group end

a = [('a1', 'A'), ('b1', 'B'), ('c1', 'C'), ('d1', 'D'), ('a2', 'A'), ('c2', 'C')]

a.sort()  # 排序,以保证能够执行分组

for key, group in groupby(a, lambda kv: kv[1]):  # 使用元组内的第二个元组作为key

print 'group start, key: %s' % key

for v, k in group:

print v,

print 'group end'

输出:

group start, key: A

a1 a2 group end

group start, key: B

b1 group end

group start, key: C

c1 c2 group end

group start, key: D

d1 group end

starmap(func, iterable)

starmap与map十分类似,具体如下:

from itertools import starmap

print list(starmap(lambda x, y: x + y, [(1,2), (3,4)]))  # 3,7

tee(iterable,n=2)

tee可以复制单个可迭代对象,默认生成2个迭代器

from itertools import tee

a = 'zxwdj'

it1, it2 = tee(a)

print list(it1), list(it2)  # ['z', 'x', 'w', 'd', 'j'] ['z', 'x', 'w', 'd', 'j']

izip(*iterables), izip_longest(*iterables,fillvalue=None)

与zip一样,都是将序列组合成元组,zip返回的是元组列表,izip和izip_longest返回的是迭代器,所以效率更高。组合时,izip以最短序列为准,izip_longest以最长序列为准,默认补充位是None。

from itertools import izip_longest, izip

print list(izip_longest('ABCD', 'xy', fillvalue='zxw'))      # [('A', 'x'), ('B', 'y'), ('C', 'zxw'), ('D', 'zxw')]

print list(izip('ABCD', 'xy', 'cde'))                        # [('A', 'x', 'c'), ('B', 'y', 'd')]

组合生成器

combinations(iterable,r), combinations_with_replacement(iterable,r), permutations(iterable,r)

combinations和combinations_with_replacement都是对iterable以组合长度r进行排列组合,在组合式,前者不包括自身,后者可以包括自身。permutations与combinations一样,只不过是全排列。

from itertools import combinations, combinations_with_replacement, permutations

print list(combinations('zxw',2))                                      # [('z', 'x'), ('z', 'w'), ('x', 'w')]

print list(combinations_with_replacement('zxw',2))                     # [('z', 'z'), ('z', 'x'), ('z', 'w'), ('x', 'x'), ('x', 'w'), ('w', 'w')]

print list(permutations('zxw',2))                                      # [('z', 'x'), ('z', 'w'), ('x', 'z'), ('x', 'w'), ('w', 'z'), ('w', 'x')]

product(*iterables)

根据传入的序列,生成笛卡尔积。

from itertools import product

a = [1,2,3]

b = [4,5,6]

c = [(1,1), (2,2), (3,3)]

print list(product(a,b))     # [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

print list(product(*c))      # [(1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3)]

python itertools模块_Python中的Itertools模块相关推荐

  1. python io模块_python中的StringIO模块

    原博文 2015-10-23 15:21 − # python中的StringIO模块 标签:python StringIO --- > 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的, ...

  2. python安装django模块_python中安装django模块的方法

    网上搜一下对应的版本号,版本号相对应. 安装django有两种方式: 1.pip安装 pip install django 这个方法我用的时候已经报错.貌似访问被阻挡.我一般都用第二种 2.下载压缩包 ...

  3. python中的random模块_Python中的random模块

    Python 中的 random 模块 1. Python 中的 random 模块用于生成随机数.下面介绍一下 random 模块中最常用 的几个函数. 2. 3. random.random 4. ...

  4. python找不到os模块_Python中的OS模块:您需要知道的一切

    Python是当今业界最强大的编程语言之一.由于Python具有许多特性和强大的通用性,许多复杂的编程目标可以很容易地在Python中实现.在本文中,我们将按照以下顺序讨论Pyt Python是当今业 ...

  5. python itertools卡死_python中的itertools的使用详解

    今天了解了下python中内置模块itertools的使用,熟悉下,看能不能以后少写几个for,嘿嘿

  6. python中xlrd模块_Python中的xlrd模块使用原理解析

    on里面的xlrd模块详解(一) - 疯了的小蜗 - 博客园[内容]:> 那我就一下面积个问题对xlrd模块进行学习一下: 什么是xlrd模块? 为什么使用xlrd模块? 1.什么是xlrd模块 ...

  7. python中的正则表达式re模块_Python中的re模块--正则表达式

    Python中的re模块--正则表达式 使用match从字符串开头匹配 以匹配国内手机号为例,通常手机号为11位,以1开头.大概是这样13509094747,(这个号码是我随便写的,请不要拨打),我们 ...

  8. python中常用的序列化模块_Python 中的序列化模块

    封面图片来源:沙沙野 序列化模块前面讲到解码编码的时候提过,网络数据传输只能通过 bytes 类型.而文件写入内容(不是指存储)既可以是 bytes,也可以是 string.这些操作都可以使用 eva ...

  9. python配置文件解析_Python中配置文件解析模块-ConfigParser

    Python中有ConfigParser类,可以很方便的从配置文件中读取数据(如DB的配置,路径的配置). 配置文件的格式是: []包含的叫section, section 下有option=valu ...

  10. pythonrandom模块_python中的random模块

    Python中的random模块用于生成随机数或随机选择,主要方法包含: random.random()生成一个0到1的随机浮点数([0,1)):0<= n < 1.0 random.un ...

最新文章

  1. HTMLCollection元素的For循环
  2. 大并发服务器架构 大型网站架构演变
  3. sql2005新增排序方法
  4. 深度学习(四十二)——深度强化学习(5)PPO, IMPALA, Hierarchical RL, OpenAI
  5. java 类的加载、连接和初始化
  6. oracle查询cpu占用率高,解决oracle进程CPU占用过高问题
  7. 用VC写Assembly代码(6)--附录3[X86指令使用详解]
  8. 关于cocos2d-x中CCScrollView和CCMenu触摸优先级的解决方案
  9. go设置后端启动_Vue 之前后端分离的跨域
  10. Nginx正向代理原理和部署方案
  11. scatter python_Python数据可视化之scatter( )函数
  12. 2019年9月23日、24日北京市出租车数据
  13. Python笔记:re模块详解
  14. 面向服务的体系架构(SOA)和企业服务总线(ESB)
  15. mysql client_multi_statements_MySQL中CLIENT_MULTI_STATEMENTS的用法
  16. Fastadmin 自带的导入Excel功能
  17. 【疑难杂症】The last packet sent successfully to the server was 0 milliseconds ago.
  18. Katago+Sabaki个人围棋AI工具安装配置
  19. 看门狗的喂法(独立看门狗和窗口看门狗的区别)!
  20. 开通知乎专栏和公众号啦!

热门文章

  1. python中的get()和item()函数
  2. 哈利波特魔法觉醒冬青心愿怎么玩
  3. uniapp 阿里图库图标引用
  4. 从0到1:搭建一个完整的kubernetes集群(kubeadm)
  5. 那些有趣/实用的 Chrome 扩展神器系列(二)
  6. java url参数加密_针对url参数的加密解密算法(原创)
  7. GIS空间索引(2)--格网索引与四叉树索引
  8. Java实现集成Google邮箱第三方登录
  9. (函数题)4-12 判断奇偶性
  10. centos7修改root密码