实用干货:itertools 内置模块中文文档
本帖最后由 zltzlt 于 2020-1-14 21:11 编辑这里是实用干货:itertools 内置模块中文文档。
如果喜欢,不要忘记评分哦!{:10_281:}
itertools 模块提供了许多用于操作迭代对象的函数。
简单使用:
>>> import itertools as i
>>> list(i.permutations(, 3)) # 排列
[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 2), (1, 3, 4), (1, 3, 5), (1, 4, 2), (1, 4, 3), (1, 4, 5), (1, 5, 2), (1, 5, 3), (1, 5, 4), (2, 1, 3), (2, 1, 4), (2, 1, 5), (2, 3, 1), (2, 3, 4), (2, 3, 5), (2, 4, 1), (2, 4, 3), (2, 4, 5), (2, 5, 1), (2, 5, 3), (2, 5, 4), (3, 1, 2), (3, 1, 4), (3, 1, 5), (3, 2, 1), (3, 2, 4), (3, 2, 5), (3, 4, 1), (3, 4, 2), (3, 4, 5), (3, 5, 1), (3, 5, 2), (3, 5, 4), (4, 1, 2), (4, 1, 3), (4, 1, 5), (4, 2, 1), (4, 2, 3), (4, 2, 5), (4, 3, 1), (4, 3, 2), (4, 3, 5), (4, 5, 1), (4, 5, 2), (4, 5, 3), (5, 1, 2), (5, 1, 3), (5, 1, 4), (5, 2, 1), (5, 2, 3), (5, 2, 4), (5, 3, 1), (5, 3, 2), (5, 3, 4), (5, 4, 1), (5, 4, 2), (5, 4, 3)]
>>> list(i.combinations(, 3)) # 组合
[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]
accumulate 类用于获取迭代序列的累加值序列(或其他的双目运算符)。
语法格式:
accumulate(iterable, func=operator.add, *, initial=None)
参数说明:
参数说明
iterable进行操作的迭代器。
func双目运算符函数,默认为 operator.add,即加法。
initial累加的初始值。
返回值:
accumulate 可迭代对象。
注意:
[*]此函数在 Python 3.2 添加。
[*]此函数在 Python 3.3 增加了可选参数 func。
[*]此函数在 Python 3.8 增加了可选参数 initial。
例子:
>>> from itertools import accumulate as a
>>> list(a()) # 返回值 等于
>>> from operator import mul
>>> list(a(, func=mul)) # 返回值 等于
>>> list(a(, initial=10)) # 设置初始值为 10
chain 类用于将多个迭代器连接起来。
语法格式:
chain(*iterables)
参数说明:
参数说明
iterables若干个迭代器,用于连接在一起。range、set、tuple、list、生成器等等都是迭代器。
返回值:
chain 可迭代对象,将多个可迭代对象连接起来的结果。
方法:
[*]from_iterable(iterable)
通过迭代器创建 chain 对象,相当于 chain(*iterable)。
>>> from itertools import chain
>>> for i in chain.from_iterable([, , , , ]): # 通过包含可迭代对象的可迭代对象 [, , , , ] 创建 chain 对象
print(i)
1
2
3
4
5
6
7
8
9
0
例子:
>>> from itertools import chain
>>> a = chain('ac', , range(4)) # 将多个迭代器连接
>>> for i in a:
# 迭代 a
print(i)
a
c
1
2
3
0
1
2
3
combinations 类用于获取迭代器中,所有长度为指定长度的不连续子序列(就是数学中的组合 C)。
语法格式:
combinations(iterable, r)
参数说明:
参数说明
iterable迭代器。
r指定的长度(整数)。
返回值:
combinations 可迭代对象。
例子:
>>> from itertools import combinations as c
>>> list(c(, 3)) # 获取 中长度为 3 的不连续子序列
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
combinations_with_replacement 类与 combinations 类大致相同,区别在于 combinations_with_replacement 返回的组合中元素是可重复的。
语法格式:
combinations_with_replacement(iterable, r)
参数说明:
参数说明
iterable迭代器。
r指定的长度(整数)。
返回值:
combinations_with_replacement 可迭代对象。
注意:
此函数在 Python 3.1 添加。
例子:
>>> from itertools import combinations_with_replacement as c
>>> list(c(, 3)) # 可重复的组合
[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 3, 3), (1, 3, 4), (1, 4, 4), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 3), (2, 3, 4), (2, 4, 4), (3, 3, 3), (3, 3, 4), (3, 4, 4), (4, 4, 4)]
compress 类用于对数据进行过滤。
语法格式:
compress(data, selectors)
参数说明:
参数说明
data要过滤的数据。
selectors判断 data 中那些数据可以过滤的迭代器。假设 selectors 为 False,那么就过滤 data。
返回值:
compress 可迭代对象。
注意:
[*]该函数在 Python 3.1 添加。
[*]如果 data 和 compress 的长度不相等,将舍弃 data 或 compress 中多出来的元素
例子:
>>> from itertools import compress as c
>>> list(c(, )) # 舍弃 selector 中最后一个 1
>>> list(c(, ))
count 类用于生成一个用于计数的无限迭代器,可指定起始值和步长。
语法格式:
count(start=0, step=1)
参数说明:
参数说明
start起始值。
step计数的步长。
返回值:
count 可迭代对象。
注意:
此函数在 Python 3.1 增加了参数 step。
例子:
>>> from itertools import count as c
>>> count = c(2.5, 1.2)
>>> for i in range(10):
print(next(count)) # 精度问题,可忽略
2.5
3.7
4.9
6.1000000000000005
7.300000000000001
8.5
9.7
10.899999999999999
12.099999999999998
13.299999999999997
cycle 类用于无限重复迭代器中的元素。
语法格式:
cycle(iterable)
参数说明:
参数说明
iterable被无限重复迭代器。
返回值:
cycle 可迭代对象。
例子:
>>> from itertools import cycle
>>> c = cycle()
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3
>>> next(c)
1
>>> next(c)
2
>>> next(c)
3
>>> next(c)
1
dropwhile 类用于将迭代器中的对象按照指定函数进行断言。
语法格式:
dropwhile(predicate, iterable)
参数说明:
参数说明
predicate指定函数,只能有一个参数。
iterable迭代器。将此迭代器的每一个元素传进 predicate,从第一个断言为 False 的元素输出。
返回值:
dropwhile 可迭代对象。
例子:
>>> from itertools import dropwhile as d
>>> list(d(lambda x: x < 5, )) # 迭代器中第一个传进函数返回 False 的元素是 5,所以从 5 开始输出
filterfalse 类用于从迭代器中过滤返回元素。与 filter 内置函数作用类似,但是此类过滤假值。
语法格式:
filterfalse(predicate, iterable)
参数说明:
参数说明
predicate指定判断函数,只能有一个参数。
iterable要过滤的迭代器。
返回值:
filterfalse 可迭代对象。
例子:
>>> from itertools import filterfalse as f
>>> list(f(lambda x: x % 2, range(10)))
>>> list(filter(lambda x: x % 2, range(10))) # 恰好相反
groupby 类用于对迭代器按照指定的函数进行分组。
语法格式:
groupby(iterable, key=None)
参数说明:
参数说明
iterable要分组的迭代器。
key指定的函数。如果不指定或指定为 None 则按照元素本身进行分组。
返回值:
groupby 可迭代对象。
例子:
>>> from itertools import groupby as g
>>> [(k, list(v)) for k, v in g(['123', '321', '123'])]
[('123', ['123']), ('321', ['321']), ('123', ['123'])]
>>> [(k, list(v)) for k, v in g(['123', '213', '321', '231'], lambda x: x[-1])] # 按照字符串的最后一个字符分组
[('3', ['123', '213']), ('1', ['321', '231'])]
islice 类用于对迭代器进行分片操作,类似于 slice。
语法格式:
islice(iterable, stop)
islice(iterable, start, stop[, step])
参数说明:
参数说明
iterable要切片的迭代器。
start起始位置。如果为 None,则从头开始迭代。
stop停止位置。如果为 None,则迭代到最后。
step步长。如果为 None,则步长为 1。
返回值:
islice 可迭代对象。
例子:
>>> from itertools import islice as s
>>> list(s(, 1, 4)) # 相当于
>>> list(s(, 2, None, 2)) # 相当于
permutations 类用于获取迭代序列中的对象不重复的排列组合。
语法格式:
permutations(iterable, r=None)
参数说明:
参数说明
iterable迭代器。
r每个组合的元素个数,默认为 None。如果为 None 则个数为迭代器元素的个数。
返回值:
permutations 可迭代对象。
注意:
如果 r 参数大于迭代器元素的个数,返回 None。
例子:
>>> from itertools import permutations as p
>>> list(p(, 2))
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
>>> list(p()) # 不指定 r 默认为迭代器的长度
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
product 类用于获取多个迭代器的笛卡尔乘积。
语法格式:
product(*iterables, repeat=1)
参数说明:
参数说明
iterables多个迭代器。
repeat迭代器重复的次数,默认为 1。
返回值:
product 可迭代对象。
例子:
>>> from itertools import product as p
>>> list(p(, 'AB'))
[(1, 'A'), (1, 'B'), (2, 'A'), (2, 'B'), (3, 'A'), (3, 'B'), (4, 'A'), (4, 'B')]
>>> list(p(range(2), repeat=3)) # 相当于 list(p(range(2), range(2), range(2)))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
repeat 类用于重复一个对象。
语法格式:
repeat(object, times=None)
参数说明:
参数说明
object要重复的对象。
times对象重复的次数,为 None 表示无限重复。
返回值:
repeat 可迭代对象。
例子:
>>> from itertools import repeat as r
>>> list(r(2, 3)) # 重复 3 次 2
starmap 类与 map 函数非常类似,区别是函数的参数来自于迭代器中的迭代器的每一个对象。
语法格式:
starmap(function, iterable)
参数说明:
参数说明
function要给 iterable 的每个元素执行的函数。
iterable包装着许多迭代器的迭代器。
返回值:
starmap 可迭代对象。
注意:
迭代器中的每一个对象必须是可迭代的。
例子:
>>> from itertools import starmap as s
>>> list(s(pow, [(2, 1), (2, 2), (2, 3)])) #
>>> list(s((lambda x, y, z: x + y - z), [(1, 2, 3), (2, 3, 4), (3, 4, 5)])) #
takewhile 类与 dropwhile 类相反,用于获取第一个断言为 False 的元素之前的所有对象。
语法格式:
takewhile(predicate, iterable)
参数说明:
参数说明
predicate函数。
iterable迭代器。
返回值:
takewhile 可迭代对象。
例子:
>>> from itertools import takewhile as t
>>> list(t(lambda x: x % 2, ))
>>> list(t(lambda x: x - 2, ))
tee() 函数用于将迭代器复制指定的次数。
语法格式:
tee(iterable, n=2)
参数说明:
参数说明
iterable要复制的迭代器。
n要复制的次数。
返回值:
由复制的迭代器组成的元组。
例子:
>>> from itertools import tee
>>> tee(range(5)) # 复制 2 次 range(5)
(<itertools._tee object at 0x03F50940>, <itertools._tee object at 0x03F50FD0>)
>>>
[, ]
>>> # 复制 5 次 range(1, 10, 2)
[, , , , ]
zip_longest 类与 zip 类似,区别是 zip_longest 按照最长的迭代器进行打包,而 zip 按照最短的迭代器进行打包。
语法格式:
zip_longest(*iterables, fillvalue=None)
参数说明:
参数说明
iterables若干个迭代器。
fillvalue当迭代器元素不足时用 fillvalue 填充。
返回值:
zip_longest 可迭代对象。
例子:
>>> from itertools import zip_longest as z
>>> list(z([(1, 2), (3, 4), (5, ), (7, )])) # 将不足的元素以 None 填充
[((1, 2),), ((3, 4),), ((5,),), ((7,),)]
>>> list(z((1, 2), (3, 4), (5, ), (7, ))) # 将不足的元素以 None 填充
[(1, 3, 5, 7), (2, 4, None, None)]
>>> list(z((1, 2), (3, 4), (5, ), (7, ), fillvalue=6)) # 将不足的元素以 6 填充
[(1, 3, 5, 7), (2, 4, 6, 6)]
>>> list(zip((1, 2), (3, 4), (5, ), (7, ))) # 现在我们用 zip 类与 zip_longest 做一个对比
[(1, 3, 5, 7)]
@小甲鱼 申精{:10_254:}
@henry2018 @一个账号 @_2_ 好不容易更新完成啦{:10_298:} zltzlt 发表于 2019-11-17 15:50
@小甲鱼 申精
@henry2018 @一个账号 @_2_ 好不容易更新完成啦
这么快就加精华了?! _2_ 发表于 2019-11-17 16:10
这么快就加精华了?!
{:10_249:} zltzlt 发表于 2019-11-17 15:50
@小甲鱼 申精
@henry2018 @一个账号 @_2_ 好不容易更新完成啦
让小甲鱼给我的帖子也加上精华吧!
又报错了?!——教你着手解决 Python 的"坏脾气"
https://fishc.com.cn/thread-150746-1-1.html
(出处: 鱼C论坛)
zltzlt 发表于 2019-11-17 16:11
...... zltzlt 发表于 2019-11-17 15:50
@小甲鱼 申精
@henry2018 @一个账号 @_2_ 好不容易更新完成啦
目录我不会弄,不然我弄一个 这样可以吗?@不二如是 谢谢大佬 _2_ 发表于 2019-11-17 16:11
让小甲鱼给我的帖子也加上精华吧!
又报错了?!——教你着手解决 Python 的"坏脾气"
https://fishc.co ...
你不是加了吗? 我怀疑你快进了,不过还是太慢了 那么 islice 和 slice 有什么区别呢? 学习了。。。。。。。。。。。。。。。。。。
页:
[1]