zltzlt 发表于 2019-11-9 13:30:19

实用干货: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)]

zltzlt 发表于 2019-11-17 15:50:17

@小甲鱼 申精{:10_254:}

@henry2018 @一个账号 @_2_ 好不容易更新完成啦{:10_298:}

_2_ 发表于 2019-11-17 16:10:33

zltzlt 发表于 2019-11-17 15:50
@小甲鱼 申精

@henry2018 @一个账号 @_2_ 好不容易更新完成啦

这么快就加精华了?!

zltzlt 发表于 2019-11-17 16:11:39

_2_ 发表于 2019-11-17 16:10
这么快就加精华了?!

{:10_249:}

_2_ 发表于 2019-11-17 16:11:44

zltzlt 发表于 2019-11-17 15:50
@小甲鱼 申精

@henry2018 @一个账号 @_2_ 好不容易更新完成啦

让小甲鱼给我的帖子也加上精华吧!
又报错了?!——教你着手解决 Python 的"坏脾气"
https://fishc.com.cn/thread-150746-1-1.html
(出处: 鱼C论坛)

_2_ 发表于 2019-11-17 16:12:28

zltzlt 发表于 2019-11-17 16:11


......

一个账号 发表于 2019-11-17 20:51:32

zltzlt 发表于 2019-11-17 15:50
@小甲鱼 申精

@henry2018 @一个账号 @_2_ 好不容易更新完成啦

目录我不会弄,不然我弄一个

zltzlt 发表于 2020-1-14 21:15:24

这样可以吗?@不二如是

weiter 发表于 2020-2-2 22:16:06

谢谢大佬

一个账号 发表于 2020-2-4 19:54:00

_2_ 发表于 2019-11-17 16:11
让小甲鱼给我的帖子也加上精华吧!
又报错了?!——教你着手解决 Python 的"坏脾气"
https://fishc.co ...

你不是加了吗?

一个账号 发表于 2020-2-23 22:18:18

我怀疑你快进了,不过还是太慢了

一个账号 发表于 2020-2-23 23:31:01

那么 islice 和 slice 有什么区别呢?

shyu126 发表于 2020-2-24 06:50:14

学习了。。。。。。。。。。。。。。。。。。
页: [1]
查看完整版本: 实用干货:itertools 内置模块中文文档