itertools模块总结
python官方library中有一个itertools模块,官方是这么介绍的:
1 | itertools — Functions creating iterators for efficient looping |
所以,itertools模块是一个创建快速、高效迭代器的模块。
分类:
- 无限型(Infinite Iterators)
- 终止于最短输入序列的迭代器(Iterators terminating on the shortest input sequence)
- 组合生成器 (Combinatoric generators)
无限迭代器
count(start, step)
- 起始参数(start)默认值为0
- 步长(step)默认值为1
- 作用: 返回以start开头的均匀间隔step步长的值
1 | from itertools import count |
结果打印输出:1 11 21 31 41 51 61 71 81 91 101 111 121 131 141
如果没有截止条件,理论上会一直打印下去。
cycle(iterable)
- iterable 为可迭代对象
- 作用:保存迭代对象的每个元素的副本,无限的重复返回每个元素的副本
1 | from itertools import cycle |
结果打印输出:a b c d e f a b c d e……
repeat(elem[, times])
- elem为述字符串,数字等对象
- times为迭代次数,默认为无限次
- 作用:按照指定的迭代次数times重复返回elem,如果不指定times,则为无限次
1 | from itertools import repeat |
结果打印输出:abcdef abcdef abcdef abcdef
终止于最短输入序列的迭代器
accumulate(seq[,func])
- seq为可迭代对象
- func为累积执行的函数(默认为
operator.add
)
1 | from itertools import accumulate |
结果打印输出:1 2 6 24 120
1 | def accumulate(iterable, func=operator.add): |
chain(*iterables)
- *iterables为一个或多个可迭代序列
- 作用:返回所有可迭代序列
1 | from itertools import chain |
结果打印输出:a b c d e f 1 2 3
compress(data, selectors)
- data为数据对象
- selectors为选择器(规则)
- 作用:返回数据对象中对应规则为True的元素
1 | from itertools import compress |
结果打印输出:a c d
dropwhile(pred,seq)
- pred为判断谓词
- seq为可迭代序列
- 作用:当pred为false时开始迭代
1 | from itertools import dropwhile |
结果打印输出:6 4 1
takewhile(pred,seq)
- pred为判断谓词
- seq为可迭代对象
- 作用:当pred为false时停止迭代
1 | from itertools import takewhile |
结果打印输出:1 4
filterfalse(pred,seq)
- pred为判断谓词
- seq为可迭代对象
- 作用:当pred为false时迭代
1 | #与filter相反 |
结果打印输出:0 2 4 6 8
groupby(iterable[, key])
- iterable为可迭代对象
- key分组的键值
- 作用:创建一个迭代器,对iterable生成的连续项进行分组,在分组过程中会查找重复项。如果iterable在多次连续迭代中生成了同一项,则会定义一个组,如果将此函数应用一个分类列表,那么分组将定义该列表中的所有唯一项,key(如果已提供)是一个函数,应用于每一项,如果此函数存在返回值,该值将用于后续项而不是该项本身进行比较,此函数返回的迭代器生成元素(key, group),其中key是分组的键值,group是迭代器,生成组成该组的所有项。
- 注意:当每次key函数返回的值变化时就产生一个新分组或break,所以需要先用key函数对对象进行排序。
1 | from itertools import groupby |
结果打印输出:
1 | middle |
1 | from itertools import islice,groupby |
结果打印输出:
1 | A ['A', 'A', 'A', 'A'] |
islice(iterable, stop) / islice(iterable, start, stop[, step ])
- iterable为可迭代对象
- start、stop、step分别为起始位置、终止位置、和步长
- 作用:创建一个迭代器,生成项的方式类似于切片返回值: iterable[start : stop : step],将跳过前start个项,迭代在stop所指定的位置停止,step指定用于跳过项的步幅。与切片不同,负值不会用于任何start,stop和step,如果省略了start,迭代将从0开始,如果省略了step,步幅将采用1.
1 | from itertools import islice |
starmap(func, seq)
- func:计算函数
- seq:需传递的参数
- 作用:创建一个迭代器,生成值
func(*item)
,其中item来自iterable,只有当iterable生成的项适用于这种调用函数的方式时,此函数才有效。 - 注意:与
map()
与starmap()
的区别类似与function(a,b)
和function(*c)
1 | from itertools import starmap |
结果打印输出:8 9 64
tee(iterable, n=2)
- iterable为可迭代对象
- n为需要的个数
- 作用:从iterable创建n个独立的迭代器,创建的迭代器以n元组的形式返回,n的默认值为2,此函数适用于任何可迭代的对象,但是,为了克隆原始迭代器,生成的项会被缓存,并在所有新创建的迭代器中使用,一定要注意,不要在调用tee()之后使用原始迭代器iterable,否则缓存机制可能无法正确工作。
1 | from itertools import tee |
结果打印输出:
1 | ['1', '2', '3', '4', '5', '6', '7', '8', '9'] |
zip_longest(iter1,iter2, …)
- iter1,iter2等为可迭代对象
- 作用:与zip()相同,但是迭代过程会持续到所有输入迭代变量iter1,iter2等都耗尽为止,如果没有使用fillvalue关键字参数指定不同的值,则使用None来填充已经使用的迭代变量的值。
1 | from itertools import zip_longest |
结果打印输出:[(‘a’, ‘1’), (‘b’, ‘2’), (‘c’, ‘-‘), (‘d’, ‘-‘)]
组合生成器
product(iter1,iter2, … [repeat=1])
- iter1,iter2等为可迭代对象
- repeat是一个关键字参数,指定重复生成序列的次数
- 作用:创建一个迭代器,生成表示item1,item2等中的项目的笛卡尔积的元组
1 | from itertools import product |
结果打印输出:(‘a’, ‘1’) (‘a’, ‘2’) (‘b’, ‘1’) (‘b’, ‘2’) (‘c’, ‘1’) (‘c’, ‘2’) (‘d’, ‘1’) (‘d’, ‘2’)
permutations(iterable [,r]):
- iterable 为可迭代对象
- r为长度
- 作用:创建一个迭代器,返回iterable中所有长度为r的项目序列,如果省略了r,那么序列的长度与iterable中的项目数量相同
1 | from itertools import permutations |
结果打印输出:(‘a’, ‘b’) (‘a’, ‘c’) (‘a’, ‘d’) (‘b’, ‘a’) (‘b’, ‘c’) (‘b’, ‘d’) (‘c’, ‘a’) (‘c’, ‘b’) (‘c’, ‘d’) (‘d’, ‘a’) (‘d’, ‘b’) (‘d’, ‘c’)
combinations(iterable, r)
- iterable 为可迭代对象
- r为长度
- 作用:创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序,元素不能重复出现
1 | from itertools import combinations |
结果打印输出:(‘a’, ‘b’) (‘a’, ‘c’) (‘a’, ‘d’) (‘b’, ‘c’) (‘b’, ‘d’) (‘c’, ‘d’)
combinations_with_replacement(iterable, r)
- iterable 为可迭代对象
- r为长度
- 作用:创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序,元素可以重复出现
1 | from itertools import combinations_with_replacement |
结果打印输出:(‘a’, ‘a’) (‘a’, ‘b’) (‘a’, ‘c’) (‘a’, ‘d’) (‘b’, ‘b’) (‘b’, ‘c’) (‘b’, ‘d’) (‘c’, ‘c’) (‘c’, ‘d’) (‘d’, ‘d’)