python自带性能强悍的标准库 itertools

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python自带性能强悍的标准库 itertools相关的知识,希望对你有一定的参考价值。

参考技术A

可迭代对象就像密闭容器里的水,有货倒不出

itertools是python内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极大的简化代码行数,同时所有方法都是实现了生成器函数,这就意味着极大的节省内存。

itertools提供的功能主要分为三大块,以最新版本的3.10为例:

方法如下:

导入包

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

数值生成器,可以指定起始位置和步长,并且步长可以为浮点数。无限输出,一直累加,在例子中需要边睡眠1s边输出。

iteratortools.cycle(iteratorable)
无限循环取出可迭代对象里的元素

iteratortools.repeat(object[, times])
不断重复输出整个object,如果指定了重复次数,则输出指定次数,否则将无限重复。

iteratortools.accumulate(iteratorable[, func, *, initial=None])
返回对列表中元素逐项的操作,操作有:

iteratortools.chain(*iteratorables)
将多个可迭代对象构建成一个新的可迭代对象,统一返回。类似于将多个对象链成一条串

优点:可以将多个可迭代对象整合成一个,避免逐个取值

chain.from_iteratorable(iteratorable)
将一个迭代对象中将所有元素类似于chain一样,统一返回。

iteratortools.compress(data, selectors)
按照真值表筛选元素

iteratortools.dropwhile(predicate, iteratorable)
按照条件筛选,丢弃掉第一次不符合条件时之前的所有元素

iteratortools.takewhile(predicate, iteratorable)

根据predicate条件筛选可迭代对象中的元素,只要元素为真就返回,第一次遇到不符合的条件就退出。

按照条件筛选,丢弃第一次遇到不符合条件之后的元素。行为类似于上一个dropwhile,区别在于丢弃的选择不同。

iteratortools.filterfalse(predicate, iteratorable)
保留不符合条件的元素,返回迭代器

iteratortools.groupby(iteratorable, key=None)
按照指定的条件分类。输出条件和符合条件的元素

iteratortools.islice(iteratorable, start, stop[, step])
对迭代器进行切片,老版本中不能指定start和stop以及步长,新版本可以。

iteratortools.starmap(function, iteratorable)
将function作用于可迭代对象上,类似于map函数

iteratortools.tee(iteratorable, n=2)
从一个可迭代对象中返回 n 个独立的迭代器

iteratortools.zip_longest(*iteratorables, fillvalue=None)

创建一个迭代器,从每个可迭代对象中收集元素。如果可迭代对象的长度未对齐,将根据 fillvalue 填充缺失值。

迭代持续到耗光最长的可迭代对象。大致相当于:

iteratortools.product(*iteratorables, repeat=1)

生成多个可迭代对象的笛卡尔积

大致相当于生成器表达式中的嵌套循环。例如, product(A, B) 和 ((x,y) for x in A for y in B) 返回结果一样。

将可选参数 repeat 设定为要重复的次数。例如,product(A, repeat=4) 和 product(A, A, A, A) 是一样的

iteratortools.permutations(iteratorable, r=None)
由 iteratorable 元素生成长度为 r 的排列。元素的排列,类似于给一个[1,2,3],选取其中两个元素,一共有多少种组合方法?不要求元素排列之后的位置。

这个方法能够完美解决算法中的全排列问题,简直是量身定做。如果早知道这么简单,当年考算法也不会。。,哎

可参见leetcode46题: https://leetcode-cn.com/problems/permutations/

iteratortools.combinations(iteratorable, r)
返回由输入 iteratorable 中元素组成长度为 r 的子序列。元素不可重复使用。子序列是要求元素在排列之后和之前的相对位置不变的。1,2,3中3在1的后面,子序列中3也一定在1的后面。

这个方法可以曲线解决组合总数问题

https://leetcode-cn.com/problems/combination-sum/

iteratortools.combinations_with_replacement(iteratorable, r)
返回由输入 iteratorable 中元素组成的长度为 r 的子序列,允许每个元素可重复出现

原文 http://www.cnblogs.com/goldsunshine/p/15678828.html

python标准库之itertools

itertools库

迭代器(生成器)在python中是一种很常用的也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用。

itertools库的几种方法介绍:

itertools.accumulate:列表累加方法

>>> import itertools
>>> x = itertools.accumulate(range(10))
>>> print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

itertools.chain:将多个列表合成一个列表的方法

>>> x = [1,2,3]
>>> y = [4,5,6]
>>> a = itertools.chain(x,y)
>>> print(list(a))
[1, 2, 3, 4, 5, 6]

itertools.combinations:求列表中指定数目的元素不重复的所有组合

注:2表示的意思是求出列表中随机2个元素搭配不重复的集合

>>> x = [1,2,3,4,5]
>>> a = itertools.combinations(x,2)
>>> print(list(a))
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]

itertools.islice:对列表进行切片

注:0表示起始位置,5表示结束位置,2表示步长

>>> x = [1,2,3,4,5]
>>> a = itertools.islice(x,0,5,2)
>>> print(list(a))
[1, 3, 5]

itertools.count:计数器,可以指定起始位置和步长

注:start表示起始位置,step表示步长

>>> x = itertools.count(start=2,step=3)
>>> print(list(itertools.islice(x,5)))
[2, 5, 8, 11, 14]

itertools.cycle:循环列表或者迭代器中的数据

>>> x = itertools.cycle(‘ABCD‘)
>>> print(list(itertools.islice(x,0,10,2)))
[‘A‘, ‘C‘, ‘A‘, ‘C‘, ‘A‘]

itertools.repeat:生成一个拥有指定数量并且元素相同的迭代器

>>> print(list(itertools.repeat(‘liuwei‘,5)))
[‘liuwei‘, ‘liuwei‘, ‘liuwei‘, ‘liuwei‘, ‘liuwei‘]
#也可用下面的方法生成相同元素的列表
>>> item = ["liu"]*5
>>> print(item)
[‘liu‘, ‘liu‘, ‘liu‘, ‘liu‘, ‘liu‘]

其它还有很多,用到的时候再进行总结

本文出自 “激情燃烧的岁月” 博客,请务必保留此出处http://liuzhengwei521.blog.51cto.com/4855442/1919807

以上是关于python自带性能强悍的标准库 itertools的主要内容,如果未能解决你的问题,请参考以下文章

Python标准库--itertools模块

Python标准库(3.x): itertools库扫盲

Python标准库13 循环器 (itertools)

Python基础 | time random collections itertools标准库详解

Python内置库itertools生成穷举字典

python itertools模块练习