itertools functions
accumulate() compress() groupby() starmap()
chain() count() islice() takewhile()
chain.from_iterable() cycle() permutations() tee()
combinations() dropwhile() product() zip_longest()
combinations_with_replacement() filterfalse() repeat()  

itertools.accumulate(iterable [, func])

  返回一个迭代序列的累加值序列(没有func的情况下)。

  当指定了func(参数必须为两个)后,将通过func进行累加。

  注1: 当没有传入func时,func相当于 operator.add

  注2: 返回值为迭代器

>>> data = [1,2,3,4]
>>> a = itertools.accumulate(data)
>>> list(a)
[1, 3, 6, 10]
#[1,2,3,4] --> [1, 1+2, (1+2)+3, ((1+2)+3)+4] >>> b = itertools.accumulate(data, operator.mul)
>>> list(b)
[1, 2, 6, 24]
#[1,2,3,4] --> [1, 1*2, (1*2)*3, ((1*2)*3)*4]

itertools.chain(*iterables)

  连接多个迭代序列为一个迭代序列,适用于需要连续遍历多个序列场景。

  注`: 返回值为迭代器

>>> a = [1,2,3,4,5]
>>> b = [6,7,8,9,10]
>>> c = itertools.chain(a,b)
>>> list(c)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

itertools.chain.from_iterable(iterable)

  通过一个迭代序列来创建 itertools.chain 的对象。

  类似于将迭代序列中的每一个对象作为 itertools.chain 的参数,因此传入的迭代序列中的每一个对象应该也是可迭代的。

  注1: 返回值为迭代器

>>> a = itertools.chain.from_iterable(['abc', 'def', 'hjk'])
>>> list(a)
['a', 'b', 'c', 'd', 'e', 'f', 'h', 'j', 'k']
>>>
>>> b = itertools.chain.from_iterable([1,2,3])
>>> list(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

itertools.combinations(iterable, r)

  将迭代序列中的对象进行"不重复的"组合并返回所有组合的元组列表,每个组合的元素个数为r

  注1: 这里的“不重复”是指迭代序列中的对象不会使用多次,但并不代表相同的值不会使用多次。

  注2: 返回的组合顺序依赖传入的迭代序列中的顺序。

  注3: 返回值为迭代器。

>>> a = itertools.combinations('ABC',2)
>>> list(a)
[('A', 'B'), ('A', 'C'), ('B', 'C')]
>>>
>>> b = itertools.combinations('CBA',2)
>>> list(b)
[('C', 'B'), ('C', 'A'), ('B', 'A')]
>>>
>>> c = itertools.combinations('AAC',2)
>>> list(c)
[('A', 'A'), ('A', 'C'), ('A', 'C')]

itertools.combinations_with_replacement(iterable, r)

  将迭代序列中的对象进行"可重复的"组合并返回所有组合的元组列表,每个组合的元素个数为r

  注1: itertools.combinations 的唯一区别就是元素可以重复使用。

  注2: 返回的组合顺序依赖传入的迭代序列中的顺序。

  注3: 返回值为迭代器

>>> a = itertools.combinations_with_replacement('ABC', 2)
>>> list(a)
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

itertools.compress(data, selectors)

  对 data 中的数据进行过滤,只保留 selectors 中对应位置为 True 的对象。

  dataselectors的序列长度可以不等,其中任意一个迭代终结,整个迭代即终结。

  注1: 返回值为迭代器

>>> a = itertools.compress('ABCDE', [1,1,0,0,0])
>>> list(a)
['A', 'B']
>>>
>>> b = itertools.compress('ABCDE', [1,1])
>>> list(b)
['A', 'B']
>>>
>>> c = itertools.compress('ABC', [1,1,0,0,1])
>>> list(c)
['A', 'B']

itertools.count(start=0, step=1)

  生成一个计数迭代器,可以指定起始点和步进,但是没有终点,可以一直迭代下去。

  一般需要配合其他的迭代器一起使用,例如作为map(), zip()的参数等。

>>> a = itertools.count(start=1, step=2)
>>> next(a)
1
>>> next(a)
3
>>> next(a)
5
>>> next(a)
7
>>> next(a)
9
>>> next(a)
11
>>> next(a)
13
>>>
>>> b = itertools.count(start=100, step=1)
>>> list(zip(b, 'ABCDE'))
[(100, 'A'), (101, 'B'), (102, 'C'), (103, 'D'), (104, 'E')]

itertools.cycle(iterable)

  生成一个循环迭代器,循环遍历传入迭代器中的对象,没有终结。

  一般需要配合其他迭代器一起使用,例如map(), zip() 的参数等

>>> a = itertools.cycle('ABC')
>>> next(a)
'A'
>>> next(a)
'B'
>>> next(a)
'C'
>>> next(a)
'A'
>>> next(a)
'B'
>>> next(a)
'C'
>>> next(a)
'A'
>>>
>>> b = itertools.cycle(range(1,4))
>>> list(zip('ABCDEFG', b))
[('A', 1), ('B', 2), ('C', 3), ('D', 1), ('E', 2), ('F', 3), ('G', 1)]

itertools.dropwhile(predicate, iterable)

  对迭代器中的对象按照 predicate 进行断言,丢弃第一个断言为False之前的所有对象。

  也可以理解为从第一个断言为False的对象开始输出。

  注1: 当出现第一个断言为False的对象后,之后的对象不再进行断言。

  注2: predicate 代表的函数只能有一个参数。

  注3: 返回值为迭代器

>>> a = itertools.dropwhile(lambda x: x<5, [3,4,5,6,5,4,3])
>>> list(a)
[5, 6, 5, 4, 3]

itertools.filterfalse(predicate, iterable)

  过滤掉迭代器中按照 predicate 断言为 True 的对象。

  如果 predicate 传入None, 则过滤掉值为 True 的对象。

  注1: 返回值为迭代器

>>> a = itertools.filterfalse(lambda x: x%2==0, range(10))
>>> list(a)
[1, 3, 5, 7, 9]
>>>
>>> b = itertools.filterfalse(None, [1,0,1,0,1,0])
>>> list(b)
[0, 0, 0]

itertools.groupby(iterable, key=None)

  对迭代序列中的对象按照key进行分组,如果key为None则按照对象本身的值进行分组。

  注1: 如果迭代序列中key值相等的对象中间间隔了其他的key值,则不会分在一个组。

  注2: 返回值为一个迭代器且返回的是一个有两个元素的元组,第一个元素为key值,第二个元素为分组对象的迭代器

>>> data = ['abc-0', 'def-0', 'xyz-1', 'tty-1', 'kkk-2']
>>> a = itertools.groupby(data, lambda x:x[-1])
>>> [(k, list(g)) for k, g in a]
[('', ['abc-0', 'def-0']), ('', ['xyz-1', 'tty-1']), ('', ['kkk-2'])]
>>>
>>>
>>> b = itertools.groupby('AAABBBCC')
>>> [(k, list(g)) for k, g in b]
[('A', ['A', 'A', 'A']), ('B', ['B', 'B', 'B']), ('C', ['C', 'C'])]

itertools.islice(iterable, stop)  itertools.islice(iterable, start, stop [, step])

  对迭代序列进行分片,类似 slice(),但是本函数中 start, stop, step 都不能为负数。

  参数 start 如果为 None, 则 start = 0

  参数 stop 如果为 None, 则迭代到最后一个

  参数 step 如果为 None, 则 step = 1

  注1: 返回值为一个迭代器

>>> data = 'ABCDEFG'
>>> a = itertools.islice(data, 3)
>>> list(a)
['A', 'B', 'C']
>>>
>>> b = itertools.islice(data, 1, 5, 2)
>>> list(b)
['B', 'D']
>>>
>>> c = itertools.islice(data, None, 3)
>>> list(c)
['A', 'B', 'C']
>>>
>>> d = itertools.islice(data, 3, None)
>>> list(d)
['D', 'E', 'F', 'G']

itertools.permutations(iterable, r=None)

  将迭代序列中的对象进行"不重复的"排列组合并返回所有组合的元组列表,每个组合的元素个数为r

  如果rNone,则长度为迭代序列的长度。

  注1: 这里的“不重复”是指迭代序列中的对象不会使用多次,但并不代表相同的值不会使用多次。

  注2: 返回的组合顺序依赖传入的迭代序列中的顺序。

  注3: 返回值为迭代器。

>>> a = itertools.permutations('ABC', 2)
>>> list(a)
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
>>>
>>> b = itertools.permutations('ABC')
>>> list(b)
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]

itertools.product(*iterables, repeat=1)

  返回多个迭代序列的笛卡尔乘积,repeat值相当于把传入的迭代器参数重复的次数。

  注1: 返回值是一个迭代器

>>> a = itertools.product('ABCD', 'xy')
>>> list(a)
[('A', 'x'), ('A', 'y'), ('B', 'x'), ('B', 'y'), ('C', 'x'), ('C', 'y'), ('D', 'x'), ('D', 'y')]
>>>
>>> b = itertools.product(range(2), repeat=3)
>>> list(b)
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
# 相当于 itertools.product(range(2), range(2), range(2))

itertools.repeat(object [, times])

  返回一个迭代器,重复传入的对象。重复的次数为 times 。

  如果没有传入times参数,则无限重复。

>>> a = itertools.repeat('hello', 3)
>>> list(a)
['hello', 'hello', 'hello']
>>>
>>> b = itertools.repeat('test')
>>> list(map(lambda x, y: x + y, b, 'ABCD'))
['testA', 'testB', 'testC', 'testD']

itertools.starmap(function, iterable)

  和 map() 类似。但是这里 function 的参数封装在迭代器中的每一个对象中。

  注1: 迭代器中的每一个对象也必须是可迭代的,哪怕函数只有一个参数。

>>> a = itertools.starmap(lambda x,y: x**y, [(2,1), (2,2), (2,3)])
>>> list(a)
[2, 4, 8]
>>>
>>> b = itertools.starmap(lambda x: x*x, [(1,),(2,),(3,)])
>>> list(b)
[1, 4, 9]

itertools.takewhile(predicate, iterable)

  与 dropwhile() 相反,对迭代器中的对象按照 predicate 进行断言,输出第一个断言为False之前的所有对象。

  注1: 当出现第一个断言为False的对象后,迭代即终止。

  注2: predicate 代表的函数只能有一个参数。

  注3: 返回值为迭代器

>>> a = itertools.takewhile(lambda x: x<5, [3,4,5,6,5,4,3])
>>> list(a)
[3, 4]

itertools.tee(iterable, n=2)

  将一个迭代器复制n次,返回一个有n个迭代器的元组。n默认为2

>>> a = itertools.tee('ABC')
>>> [list(x) for x in a]
[['A', 'B', 'C'], ['A', 'B', 'C']]
>>>
>>> b = itertools.tee(range(5), 3)
>>> [list(x) for x in b]
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

itertools.zip_longest(*iterables, fillvalue=None)

  类似于 zip()。但是这里按照最长的迭代序列进行打包,缺少的元素用 fillvalue 的值进行填充。

  注1: fillvalue 默认为None, 并且如果是None,填充的就是None

>>> a = itertools.zip_longest('ABC', 'xy', fillvalue='*')
>>> list(a)
[('A', 'x'), ('B', 'y'), ('C', '*')]
>>>
>>> b = itertools.zip_longest('ABC', 'xy')
>>> list(b)
[('A', 'x'), ('B', 'y'), ('C', None)]

Python标准库(3.x): itertools库扫盲的更多相关文章

  1. Python标准库13 循环器 (itertools)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在循环对象和函数对象中,我们了解了循环器(iterator)的功能.循环器是对象的 ...

  2. Python标准库笔记(10) — itertools模块

    itertools 用于更高效地创建迭代器的函数工具. itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发.它们的目的是快速有效地使用内存, ...

  3. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

  4. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

  5. Python标准库笔记(11) — Operator模块

    Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...

  6. python 标准库大全

    python 标准库 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 string ...

  7. Python标准库--typing

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 Python 3.5 增加了一个有意思的库--typ ...

  8. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  9. python标准库00 学习准备

    Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...

随机推荐

  1. C++ 如何快速清空vector以及释放vector内存?

    平时我们在写代码时候,有思考过要主动去释放vector的内存吗? 1.对于数据量不大的vector,没有必要自己主动释放vector,一切都交给操作系统. 2.但是对于大量数据的vector,在vec ...

  2. PHP接口类interface使用方法

    PHP同大多数的面向对象语言一样,并不支持多重继承.少数支持多重继承的语言中最著名的就是C++和Smalltalk.如果需要实现多重继承功能,在PHP中,可以通过接口,它是PHP解决多重继承问题的方法 ...

  3. 中国象棋V2:Java源代码、毕业设计等所有文档,已经全部提交到CSDN-Code平台

    下载地址:https://code.csdn.net/FansUnion/chinesechess-v2 主要内容:Java源代码.毕业设计.API文档.声音图片等资源.Demo截图等一切的一切. 2 ...

  4. KeePass v1.30

    Changes from 1.29 to 1.30: New Features:Refined application icons (thanks to Victor Andreyenkov).Add ...

  5. 电子商务系统的设计与实现(十三):分页组件,从前到后,从JS到Java

    一.概述   学习实践Web开发5年多了,直到今天,我才算真正实现了最基本最常用的分页组件. 包括:    a.前端JS异步加载并渲染:    b.前端JSP.Freemarker.Struts标签渲 ...

  6. hadoop 3.x 启动过程中 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

    出现这种状况是因为当前账号没有配置ssh免密登录 进入到以下目录,查看是否生成过秘钥对,如果有的话直接ssh-copy-id 主机名 没有的话执行ssh-keygen -t rsa后再重新执行ssh- ...

  7. navigator 页面链接

    页面链接. 属性名 类型 默认值 说明 url String   应用内的跳转链接 redirect Boolean false 是否关闭当前页面 hover-class String navigat ...

  8. Spring MVC【入门】一篇!

    MVC 设计概述 在早期 Java Web 的开发中,统一把显示层.控制层.数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,我们称之为 Model1:     出现的弊端: JSP ...

  9. 有关C++中String的一些知识

    在C++中,String 是一个类,相当于其他简单的类一样,它之中也包含很多简单的处理字符串的函数. 具体见 已下载好的String 类的基本操作 PDF.(大学那点事)

  10. 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)

    原文 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图) UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式.不过,总有一些特别的情况下我们需要用到不止一个窗口 ...