Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python笔记:itertools库简介

Python笔记:itertools库简介

作者头像
codename_cys
发布于 2021-03-27 13:05:46
发布于 2021-03-27 13:05:46
62800
代码可运行
举报
文章被收录于专栏:我的充电站我的充电站
运行总次数:0
代码可运行
  • Python笔记:itertools库简介
    • 1. itertools库是什么
    • 2. itertools库函数简介
      • 1. 元素迭代相关
        • 1. count
        • 2. cycle
        • 3. repeat
      • 2. 排列组合相关
        • 1. product
        • 2. permutations
        • 3. combinations
        • 4. combinations_with_replacement
      • 3. 其他内置函数
        • 1. accumulate
        • 2. chain & chain.from_iterable
        • 3. compress
        • 4. dropwhile
        • 5. filterfalse
        • 6. groupby
        • 7. islice
        • 8. starmap
        • 9. takewhile
        • 10. tee
        • 11. zip_longest
    • 3. 参考链接

1. itertools库是什么

itertools库是python中的一个专门用于高效处理迭代问题的内置函数库。

就我个人而言,其中我最常使用的是其中的四个函数,分别为:

  1. repeat()
  2. accumulate()
  3. permutations()
  4. combinations()

至于其他的函数,坦率地说我倒是基本都没怎么用过,不过这次既然打算写了,就一次性把这些都写了吧。

最后提一嘴,itertools的官方文档写的真的很好,强烈建议直接去看官方文档,这里估计也就是把各个函数的功能全部提一嘴,官方文档里面还给出了具体的python代码实现,更有利于对函数的深刻理解。

所以,如果真的想好好了解一下各个函数的具体实现,强烈,强烈,建议直接看官方文档!

2. itertools库函数简介

itertools库内置有19个函数,分别从属于三个大类,分别为:

  1. 元素迭代相关
  2. 排列组合相关
  3. 其他内置函数

下面,我们来逐次对其进行考察。

1. 元素迭代相关

1. count

计数器函数,就是一个无限的计数器,代码实现可以借下述python代码进行理解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def count(start, step):
    while True
        yield start
        start += step
2. cycle

就是一个循环取元素的迭代器,功能可以借下述python代码进行理解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def cycle(iterable):
    while True:
        for elem in iterable:
            yield elem
3. repeat

就是一个对某一元素进行重复输出的函数,其代码功能与下述实现相同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def repeat(object, times=None):
    if time is None:
        while True:
            yield object
    else:
        for _ in range(times):
            yield object

2. 排列组合相关

1. product

product函数就是一个全排列函数,对于一系列候选集,给出其全排列。

官网中给出的python代码实现样例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def product(*args, repeat=1):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

上述代码本身具有自解释性,这里就不用再多说了。

2. permutations

permutations(iterable, r=None)函数用于处理排列组合问题中的排列问题。

假设iterable中存在有n个元素,则输出就是一个所有 A n r A_n^r Anr​个元素的有序全排列。

其python代码实现示例可以直接看官网中的实现。

3. combinations

combinations(iterable, r=None)函数用于处理排列组合问题中的组合问题。

假设iterable中存在有n个元素,则输出就是一个所有 C n r C_n^r Cnr​个元素的有序全排列。

其python代码实现示例可以直接看官网中的实现。

4. combinations_with_replacement

这个函数功能比较奇葩,大致类似于combinations与permutations的组合,第i+1个候选元素为从包含第i个元素开始的后面所有元素。

结合python实现来看会更加清晰一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def combinations_with_replacement(iterable, r=None):
    n = len(iterable)
    r = n if r is None else r
    res = []
    def dp(idx, r, history):
        if r == 0:
            res.append(tuple(history))
            return
        for i in range(idx, n):
            dp(i, r-1, history + [iterable[i]])
    dp(0, r, [])
    for it in res:
        yield it

print(list(combinations_with_replacement("abc", 2)))
# [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]

3. 其他内置函数

1. accumulate

累加函数,功能类似于matlab中的cumsum,唯一的区别在于返回的是一个迭代器。

直接看代码可能就足够直观了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def accumulate(iterable):
    tot = 0
    for it in iterable:
        tot += it
        yield tot

当然,真实的情况会更复杂一点,但是就功能说明而言上面这部分足以说明一切了。

2. chain & chain.from_iterable

从功能来说这两个函数完全一致,无非就是传参方面稍微有点区别,他们的功能都是直接将一系列的iterable拆成原子单元然后通过迭代器方式返回。

同样,直接给出解释代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def chain(*iterables):
    for iterable in iterables:
        for elem in iterable:
            yield elem

def chain.from_iterable(iterables):
    for iterable in iterables:
        for elem in iterable:
            yield elem
3. compress

compress函数的功能就是一个filter函数,根据输入中的selector向量选择其中真值对应的元素进行输出。

用代码说明会更加清晰一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def compress(data, selectors):
    for d, s in zip(data, selectors):
        if s:
            yield d
4. dropwhile

dropwhile函数的功能与do while极其相似,但是功能相反,就是以迭代器的方式输出从一个不满足判定条件开始的所有元素。

同样用代码解释如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def dropwhile(predicate, iterable):
    drop = True
    for it in iterable:
        if drop and not predicate(it):
            drop = False
        if not drop:
            yield it
5. filterfalse

filterfalse函数就是一个过滤函数,返回一个迭代器,输出过滤条件判断为否的数据。

用代码语言表达如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def filterfalse(predicate, iterable):
    for x in iterable:
        if not predicate(x):
            yield x
6. groupby

groupby函数用于将向量中连续的元素打包成一个迭代器之后再以迭代器的方式进行输出。

用代码语言解释如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def groupby(iterable, key_func=None):
    n = len(iterable)
    i = 0 
    while i < n:
        j = i+1
        while j < n and iterable[j] == iterable[i]:
            j += 1
        x = iterable[i] if key_func is None else key_func(iterable[i])
        yield (x, (item for item in iterable[i:j]))
        i = j
7. islice

islice函数就是一个列表的元素选取函数,其定义有两种:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def islice(iterable, stop):
    stop = len(iterable) if stop is None else stop
    for x in iterable[:stop]:
        yield x

def islice(iterable, start, stop, step=1):
    stop = len(iterable) if stop is None else stop
    for x in iterable[start:end:step]:
        yield x
8. starmap

starmap函数则是相当于map函数的迭代器版本,其功能如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def starmap(function, iterable):
    for args in iterable:
        yield function(*args)
9. takewhile

takewhile和dropwhile功能刚好相反,一直取用元素直至判断条件不再满足。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def takewhile(predicate, iterable):
    for x in iterable:
        if predicate(x):
            yield x
        else:
            break
10. tee

tee函数坦率地说没看出来有啥用,功能倒是可以用如下python代码直观的看出来,但实在没看出来有啥用处,反正我也没用到过。。。

如果有了解的读者可以在评论区答复一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def tee(iterable, n):
    return tuple([iter(iterable) for _ in range(n)])
11. zip_longest

zip_longest的功能是将一串向量按照最长序列进行补足后以迭代器的方式进行输出。

用代码解释如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def zip_longest(*iterables, fillvalue=None):
    def get_element(iterable, idx):
        return fillvalue if idx >= len(iterable) else iterable[idx]
        
    n = max(len(iterable) for iterable in iterables)
    for i in range(n):
        yield tuple([get_element(x, i) for x in iterables])

3. 参考链接

  1. https://docs.python.org/3/library/itertools.html
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/09/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python标准库笔记(10) — itertools模块
目录[-] itertools 用于更高效地创建迭代器的函数工具。 itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发。它们的目的是快速有效地使用内存,并且将它们关联在一起以表示更复杂的基于迭代的算法。 基于迭代器的代码比使用列表的代码提供了更好的内存消耗特性。因为直到数据需要使用时才从迭代器中生成,所有数据不需要同时存储在内存中。这种 “惰性” 的处理模式可以减少大型数据集的交换和其他副作用,从而提高性能。 除了 itertools 中
jhao104
2018/06/19
1.9K0
进阶的运维开发(二)- 迭代器和生成器
python迭代器于平常的可迭代对象相比,拥有占用字节少等优点,往往在处理大量可迭代对象的时候应该优先考虑迭代器实现,如下面的例子:
奔跑的骆驼
2020/01/29
6830
Python进阶笔记
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。一般是利用原有的数据结构来生成新的列表。
py3study
2020/01/03
1.1K0
Python 模块:itertools
在某些情况下,我们通常需要对序列进行一些复杂的操作,比如从序列中选出一部分元素做排列,组合,笛卡尔积等。如果自己实现这个操作未免太繁琐了,而且还会占用大量的空间,这个时候我们可以求助于 Python 模块——itertools。这个模块总共有 3 部分——无穷迭代器,根据最短输入序列的长度停止的迭代器,排列组合迭代器。
不可言诉的深渊
2019/07/26
7770
Python标准库(1) — itertools模块
專 欄 ❈Jerry,Python中文社区专栏作者。 blog:https://my.oschina.net/jhao104/blog github:https://github.com/jhao104 ❈— 简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数。 itertools.chain(*iterable) 将多个序列作为一个单独的序列返回。 例如: import itertoolsfor each
Python中文社区
2018/01/31
7070
Python3标准库built-in、
Python3中实现了很多生成器函数,本篇主要介绍built-in、itertools、functools模块中的生成器。
py3study
2020/01/02
1.5K0
《流畅的Python》第十四章学习笔记
__next__:返回下一个可用的元素,如果没有元素了抛出StopIteration异常
zx钟
2021/03/10
6360
《流畅的Python》第十四章学习笔记
Python高效编程之itertools模块详解
在打印内容字节数较小时,全部载入内存后,再打印,没有问题。可是,如果现在有成千上百万条车辆行驶轨迹,叫你分析出其中每个客户的出行规律,堵车情况等,假如是在单机上处理这件事。
小草AI
2019/11/07
6320
Python Iteration,itertools(Python迭代器,itertool个人总结)
当迭代的对象是一个list对象的时候,他打印的是每一个list对象  for i in [1,2,3,4]:  pritn(i)  打印的结果:  1  2  3  4
用户7886150
2020/11/30
6020
itertools拼装迭代器与生成器
Python内置的标准库itertools有很多函数,可以用来安排迭代器之间的交互关系,这使得在纯Python中有可能创建简洁又高效的专用工具,比如排列组合!
可以叫我才哥
2021/08/05
5340
满满干货!20个Python使用小技巧
对别名的修改会影响原变量,(浅)复制中的元素是原列表中元素的别名,而深层复制是递归的进行复制,对深层复制的修改不影响原变量。
程序员小二
2022/01/04
6970
满满干货!20个Python使用小技巧
python标准库Itertools和collections实用技巧
▍9、创建一个迭代器,它从iterable中过滤元素,只返回谓词为False的元素
小草AI
2019/07/31
7101
Python: itertools模块任性迭代
itertools 模块 该模块包含了一系列处理可迭代对象(sequence-like)的函数,从此迭代更任性。 迭代器有一些特点,比如lazy,也就是只有用到的时候才读入到内存里,这样更快更省内存;比如只能调用一次,会被消耗掉。 import itertools as itls 合并迭代器: chain()与izip() chain()函数接收n个可迭代对象,然后返回一个他们的合集的迭代器,纵向合并,上例子。 for i in itls.chain([1,2,3],['a','b','c']):
用户2183996
2018/06/21
6630
【使用Python实现算法】05 标准库(函数式编程模块)
Python 标准库中的functools和itertools模块,提供了一些函数式编程的工具函数。
杜逸先
2023/04/13
4450
python itertools
>>> import itertools >>> iter=itertools.permutations([1,2,3]) >>> iter <itertools.permutations object at 0x0000000002209780> >>> list(iter) [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)] >>> >>> >>> dir(itertools) ['__doc__', '__name__'
葫芦
2019/04/17
3770
python中 itertools模块的使用方法
accumulate(iterable: Iterable, func: None, initial:None)
Python学习者
2023/04/08
1.8K0
Python标准库(1) — itertools模块
目录[-] 简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数。 itertools.chain(*iterable) 将多个序列作为一个单独的序列返回。 例如: import itertools for each in itertools.chain('i', 'love', 'python'): print each 输出: i l o v e p y t h o n itertools.combin
jhao104
2018/03/20
9240
这段代码很Pythonic | 相见恨晚的 itertools 库
作者:忆先 来源:见文末 前言 最近事情不是很多,想写一些技术文章分享给大家,同时也对自己一段时间来碎片化接受的知识进行一下梳理,所谓写清楚才能说清楚,说清楚才能想清楚,就是这个道理了。 很多人都致力于把Python代码写得更Pythonic,一来更符合规范且容易阅读,二来一般Pythonic的代码在执行上也更有效率。今天就先给大家介绍一下Python的系统库itertools。 itertools库 迭代器(生成器)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优
小小科
2018/06/20
6280
python 迭代器、生成器、yield、iter
只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数 调用生成器函数时,会返回一个生成器对象
Michael阿明
2021/09/06
1.1K0
【Python入门第十三讲】可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)
在 Python 中,可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)是处理数据集合和处理大数据时常用的概念和工具。
不惑
2024/02/08
1.9K0
【Python入门第十三讲】可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)
相关推荐
Python标准库笔记(10) — itertools模块
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验