浅析Python自带性能强悍的标准库itertools

目录
  • 前言
  • 无限迭代
  • 有限迭代
  • 排列组合迭代

前言

 

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

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

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

  • 对可迭代对象无限迭代,无限输出
  • 对可迭代对象有限迭代
  • 对可迭代对象排列组合

方法如下:

导入包

>>> from iteratortools import *

无限迭代

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

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

>>> import time
>>> iterator = count(4, 0.5)
>>> for i in iterator:
...     print(i)
...     time.sleep(1)
...
4
4.5
5.0
5.5
6.0
6.5
7.0
7.5

iteratortools.cycle(iteratorable)

无限循环取出可迭代对象里的元素

>>> a = cycle("ABCD")
>>> import time
>>> for i in a:
...     print(i)
...     time.sleep(1)
...
A
B
C
D
A
B
C
D

iteratortools.repeat(object[, times])

不断重复输出整个object,如果指定了重复次数,则输出指定次数,否则将无限重复。

>>> iterator = repeat('hello world', 10)
>>>
>>> for i in iterator:
...     print(i)
...
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world

有了这个神器,对输出10次hello world这种问题又有一种新解法

有限迭代

iteratortools.accumulate(iteratorable[, func, *, initial=None])

返回对列表中元素逐项的操作,操作有:

  1. 累加,返回累加到每一项的列表
  2. 累乘,返回累乘到每一项的列表
  3. 最小值,返回到当前项的最小值
  4. 最大值,返回到当前项的最大值
>>> [2, 4, 8, 1, 3, 5]
[2, 4, 8, 1, 3, 5]
>>> arr = [2, 4, 8, 1, 3, 5]
>>>
>>> add = accumulate(arr)
>>>
>>> list(add)
[2, 6, 14, 15, 18, 23]
>>>
>>> max = accumulate(arr, max)
>>> list(max)
[2, 4, 8, 8, 8, 8]
>>>
>>> import operator
>>> mul = accumulate(arr, operator.mul)
>>> list(mul)
[2, 8, 64, 64, 192, 960]
>>>
>>> min = accumulate(arr, min)
>>> list(min)
[2, 2, 2, 1, 1, 1]

iteratortools.chain(*iteratorables)

将多个可迭代对象构建成一个新的可迭代对象,统一返回。类似于将多个对象链成一条串

>>> iterator = chain([1,2,3],['a','b','c'],(5,6,7))
>>> list(iterator)
[1, 2, 3, 'a', 'b', 'c', 5, 6, 7]

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

chain.from_iteratorable(iteratorable)

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

>>> chain.from_iteratorable(['abc','def'])
<iteratortools.chain object at 0x1083ae460>
>>> iterator = chain.from_iteratorable(['abc','def'])
>>> list(iterator)
['a', 'b', 'c', 'd', 'e', 'f']

iteratortools.compress(data, selectors)

按照真值表筛选元素

>>> arr = [1,2,3,4]
>>> selectors = [1,0,1,0]
>>>
>>> iterator = compress(arr, selectors)
>>>
>>> list(iterator)
[1, 3]

iteratortools.dropwhile(predicate, iteratorable)

按照条件筛选,丢弃掉第一次不符合条件时之前的所有元素

>>> arr = [1,2,3,2,1,2,1]
>>> iterator = dropwhile(lambda x: x<3, arr)
>>> list(iterator)
[3, 2, 1, 2, 1]

iteratortools.takewhile(predicate, iteratorable)

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

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

iteratortools.filterfalse(predicate, iteratorable)

保留不符合条件的元素,返回迭代器

>>> arr = [1,2,3,4,5]
>>> iterator = filterfalse(lambda x:x<3, arr)
>>> list(iterator)
[3, 4, 5]

iteratortools.groupby(iteratorable, key=None)

按照指定的条件分类。输出条件和符合条件的元素

>>> iterator = groupby(arr, lambda x: x>3)
>>> for condition ,numbers in iterator:
...     print(condition, list(numbers))
...
False [1, 2, 3]
True [4, 5]

iteratortools.islice(iteratorable, start, stop[, step])

对迭代器进行切片,老版本中不能指定start和stop以及步长,新版本可以。

>>> iterator = count()
>>> slice_iterator = islice(iterator, 10, 20, 2)
>>> list(slice_iterator)
[10, 12, 14, 16, 18]

iteratortools.starmap(function, iteratorable)

将function作用于可迭代对象上,类似于map函数

iteratortools.tee(iteratorable, n=2)

从一个可迭代对象中返回 n 个独立的迭代器

>>> iterator = tee(arr)
>>> for i in iterator:
...     print(type(i), list(i))
...
<class 'iteratortools._tee'> [1, 2, 3, 4, 5]
<class 'iteratortools._tee'> [1, 2, 3, 4, 5]

iteratortools.zip_longest(*iteratorables, fillvalue=None)

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

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

>>> iterator = zip_longest("ABCD", "xy", fillvalue="-")
>>> list(iterator)
[('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')]

排列组合迭代

iteratortools.product(*iteratorables, repeat=1)

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

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

>>> iterator = product("123", "abc")
>>> list(iterator)
[('1', 'a'), ('1', 'b'), ('1', 'c'), ('2', 'a'), ('2', 'b'), ('2', 'c'), ('3', 'a'), ('3', 'b'), ('3', 'c')]

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

iteratortools.permutations(iteratorable, r=None)

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

>>> iter = permutations([1,2,3], r=3)
>>> list(iterator)
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

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

可参见leetcode46题: 力扣

iteratortools.combinations(iteratorable, r)

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

>>> iterator = combinations([1,2,3,4], r = 3)
>>> list(iterator)
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
>>> iterator = combinations([1], r = 3)
>>> list(iterator)
[]

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

力扣

iteratortools.combinations_with_replacement(iteratorable, r)

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

>>> iter = combinations_with_replacement([1,2,3,4], r=2)
>>> list(iter)
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (4, 4)]

>>> iterator = combinations_with_replacement([1], r=3)
>>> list(iterator)
[(1, 1, 1)]

到此这篇关于浅析Python自带性能强悍的标准库itertools的文章就介绍到这了,更多相关Python 标准库itertools内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python函数式编程中itertools模块详解

    目录 容器与可迭代对象 count() 函数 cycle 函数 repeat 函数 enumerate 函数,添加序号 accumulate 函数 chain 与 groupby 函数 zip_longest 与 zip tee 函数 compress 函数 islice.dropwhile.takewhile.filterfalse.filter 总结 容器与可迭代对象 在正式开始前先补充一些基本概念在 Python 中存在容器 与 可迭代对象 容器:用来存储多个元素的数据结构,例如 列表,元

  • Python标准库itertools的使用方法

    Python标准库itertools模块介绍 itertools是python内置的模块,使用简单且功能强大,这里尝试汇总整理下,并提供简单应用示例:如果还不能满足你的要求,欢迎加入补充. 使用Python标准库itertools只需简单一句导入:import itertools chain() 与其名称意义一样,给它一个列表如 lists/tuples/iterables,链接在一起:返回iterables对象. letters = ['a', 'b', 'c', 'd', 'e', 'f']

  • Python编程itertools模块处理可迭代集合相关函数

    容器与可迭代对象 在正式开始前先补充一些基本概念在 Python 中存在容器 与 可迭代对象 容器:用来存储多个元素的数据结构,例如 列表,元组,字典,集合等内容: 可迭代对象:实现了 __iter__ 方法的对象就叫做可迭代对象. 从可迭代对象中还衍生出 迭代器 与 生成器: 迭代器:既实现了 __iter__,也实现了 __next__ 方法的对象叫做迭代器: 生成器:具有 yield 关键字的函数都是生成器. 这样就比较清楚了,可迭代对象的范围要大于容器.而且可迭代对象只能使用一次,使用完

  • python中itertools模块使用小结

    Python 内置的 itertools 模块包含了一系列用来产生不同类型迭代器的函数或类,这些函数的返回都是一个迭代器,我们可以通过 for 循环来遍历取值,也可以使用 next() 来取值. itertools 模块提供的迭代器函数有以下几种类型: 无限迭代器:生成一个无限序列,比如自然数序列 1, 2, 3, 4, ...: 有限迭代器:接收一个或多个序列(sequence)作为参数,进行组合.分组和过滤等: 组合生成器:序列的排列.组合,求序列的笛卡儿积等. itertools 高效循环

  • 关于Python 内置库 itertools

    目录 1.itertools库 2.使用itertools 3.itertools.accumulate 4.itertools.chain 5.itertools.combinations_with_replacement 6.itertools.compress 7.itertools.count 8.itertools.cycle 9.itertools.dropwhile 10.itertools.filterfalse 11.itertools.groupby 12.itertools

  • 详解python itertools功能

    介绍 itertools是python内置的模块,使用简单且功能强大,这里尝试汇总整理下,并提供简单应用示例:如果还不能满足你的要求,欢迎加入补充. 使用只需简单一句导入:import itertools chain() 与其名称意义一样,给它一个列表如 lists/tuples/iterables,链接在一起:返回iterables对象. letters = ['a', 'b', 'c', 'd', 'e', 'f'] booleans = [1, 0, 1, 0, 0, 1] print(l

  • Python中itertools的用法详解

    iterator 循环器(iterator)是对象的容器,包含有多个对象.通过调用循环器的next()方法 (next()方法,在Python 3.x中),循环器将依次返回一个对象.直到所有的对象遍历穷尽,循环器将举出StopIteration错误. 在for i in iterator结构中,循环器每次返回的对象将赋予给i,直到循环结束.使用iter()内置函数,我们可以将诸如表.字典等容器变为循环器.比如 for i in iter([2, 4, 5, 6]): print i 标准库中的i

  • 浅析Python自带性能强悍的标准库itertools

    目录 前言 无限迭代 有限迭代 排列组合迭代 前言   可迭代对象就像密闭容器里的水,有货倒不出 itertools是python内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极大的简化代码行数,同时所有方法都是实现了生成器函数,这就意味着极大的节省内存. itertools提供的功能主要分为三大块,以最新版本的3.10为例: 对可迭代对象无限迭代,无限输出 对可迭代对象有限迭代 对可迭代对象排列组合 方法如下: 导入包 >>> from iteratortools imp

  • python使用标准库根据进程名如何获取进程的pid详解

    前言 标准库是Python的一个组成部分.这些标准库是Python为你准备好的利器,可以让编程事半功倍.特别是有时候需要获取进程的pid,但又无法使用第三方库的时候.下面话不多说了,来一起看看详细的介绍吧. 方法适用linux平台. 方法1 使用subprocess 的check_output函数执行pidof命令 from subprocess import check_output def get_pid(name): return map(int,check_output(["pidof&

  • C++超详细讲解标准库

    目录 一.有趣的重载 二.C++ 标准库 三.小结 一.有趣的重载 操作符 << 的原生意义是按位左移,例:1 <<2; 其意义是将整数 1 按位左移2位,即:0000 0001 → 0000 0100 现在来尝试一下重载左移操作符,将变量或常量左移到一个对象中! #include <stdio.h> const char endl = '\n'; class Console { public: Console& operator << (int i

  • 浅析Python语言自带的数据结构有哪些

    Python作为一种脚本语言,其要求强制缩进,使其易读.美观,它的数据类型可以实现自动转换,而不需要像C.Java那样给变量定义数据类型,使其编写非常方便简单,所以广受大家的欢迎. 现如今,Python已经广泛的应用于数据分析.数据挖掘.机器学习等众多科学计算领域.所以既然涉及到科学计算,深入了解Python原生提供的数据结构是很有必要的,这样才能在数据的海洋中游刃有余.得心应手.本文便以此展开,做一个归纳整理,方便收藏. Python 一.序列结构 首先介绍的数据结构是序列结构,所谓序列,也就

  • 浅析python标准库中的glob

    glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob.glob('dir/*'): print (name) dir/file.txt dir/file1.txt dir/file2.txt dir/filea.txt dir/fileb.txt dir/subdir 列出子目录中的文件,必须在模式中包括子目录名: import glob #用子目录查询文件 print ('Name

  • 一篇文章带你了解python标准库--time模块

    目录 1. 调用语法: 2. time概述 3. 时间获取 4. 时间格式化(将时间以合理的方式展示出来) 5. 程序计时应用 6. 示例 总结 Time库是python中处理时间的标准库 1. 调用语法: import time time.<b>() 计算机时间的表达,提供获取系统时间并格式化输出功能 提供提供系统精确即使功能,用于程序性能分析 2. time概述 time库包括三类函数 时间获取: time() ctime() gmtime() 时间格式化: strftime() strp

  • 浅析python中5个带key的内置函数

    目录 1.max取最大值函数 2.min取最小值函数 3.filter过滤函数 实例1 实例2 4.map序列映射函数 实例1 实例2 5.sorted序列排序函数 (1) cmp参数 (2)key参数 (3)reverse参数 1.max取最大值函数 max() 方法返回给定参数的最大值,参数可以为序列. lis = [1,2,3,-4] print(max(lis)) #返回lis列表中的最大值 '''结果: 3 ''' print(max(lis,key=abs)) #key参数指向绝对值

  • 浅析Python 读取图像文件的性能对比

    使用 Python 读取一个保存在本地硬盘上的视频文件,视频文件的编码方式是使用的原始的 RGBA 格式写入的,即无压缩的原始视频文件.最开始直接使用 Python 对读取到的文件数据进行处理,然后显示在 Matplotlib 窗口上,后来发现视频播放的速度比同样的处理逻辑的 C++ 代码慢了很多,尝试了不同的方法,最终实现了在 Python 中读取并显示视频文件,帧率能够达到 120 FPS 以上. 读取一帧图片数据并显示在窗口上 最简单的方法是直接在 Python 中读取文件,然后逐像素的分

  • 一篇文章带你了解python标准库--random模块

    目录 1. random库基本介绍 2. random库概述 2.1 基本随机函数 2.2 扩展随机函数 3. 随机数函数的使用 4. 实例 总结 1. random库基本介绍 Random库时使用随机数的python标准库 伪随机数:采用梅森旋转算法生成的(伪)随机序列中的元素 Random库主要用于生成随机数 使用random库:import random 2. random库概述 Random库包含两类函数,常用共8个 基本随机函数:seed() random() 扩展随机函数:randi

随机推荐