文章目录

  • 一、合并和分解迭代器
    • 1、chain:首尾相接
    • 2、zip / zip_longest:对齐取数
    • 3、islice:切片
    • 4、tee:分裂
  • 二、转换输入
    • 1、map / starmap:函数映射
  • 三、生成新值
    • 1、count:生成连续整数
    • 2、repeat:单个值的重复
    • 3、cycle:某段内容的循环重复
  • 四、过滤
    • 1、takewhile:获取元素直至 False
    • 2、dropwhile:跳过元素直至 False
    • 3、filter / filterfalse:筛选每个元素
    • 4、compress:迭代器控制元素输出
  • 五、数据分组
    • 1、groupby:对连续相同元素分组
  • 六、合并输入
    • 1、accumulate:元素累加
    • 2、product:笛卡尔积
    • 3、permutations:元素有序排列,M个元素中选N个
    • 4、combinations:元素无序组合,M个元素中选N个
    • 5、combinations_with_replacement:考虑自身元素的无序组合

itertools模块包括一组用于处理序列数据集的函数。该模块的目的是能够快速处理数据、高效使用内存,以及表述更加复杂的迭代算法。

import itertools

一、合并和分解迭代器

1、chain:首尾相接

chain可以把多个源迭代器从头到尾连接成一个迭代器:

it = itertools.chain(iter([1, 2, 3]), ['a', 'b', 'c'])
>>> list(it): [1, 2, 3, 'a', 'b', 'c']

chain.from_iterable()方法适用于无法提前知道源迭代器数据,或者需要采用懒方式计算的情况。注意,该方法只能传入一个参数

def make_iterables_to_chain():yield [1, 2, 3]yield ['a', 'b', 'c']it = itertools.chain.from_iterable(make_iterables_to_chain())
>>> list(it): [1, 2, 3, 'a', 'b', 'c']

2、zip / zip_longest:对齐取数

Python 内置的zip函数可以把多个源迭代器封装成惰性生成器(lazy generator),每次推进时会从这些源迭代器中分别获取下一个元素值,形成元组返回:

it = zip([1, 2, 3], ['a', 'b', 'c'])
>>> list(it): [(1, 'a'), (2, 'b'), (3, 'c')]

任何一个源迭代器耗尽,zip就会停止,也就是说,zip惰性生成器的可迭代次数,取决于最短源迭代器的可迭代次数。

itertools模块中的zip_longest函数会将所有的源迭代器耗尽,即使它们的可迭代次数不同。默认会把源迭代器缺少的值替换为None,可以借助参数fillvalue来指定缺失值的替换值:

it = itertools.zip_longest([1, 2, 3, 4], ['a', 'b', 'c'], fillvalue='missing_value')
>>> list(it): [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'missing_value')]

3、islice:切片

islice在不拷贝数据的前提下,按照下标切割源迭代器。与列表相同,islice同样包括开始位置start、结束位置end和步长step,其中startstep是可选的。

# 仅配置结束位置
it = itertools.islice([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5)
>>> list(it): [0, 1, 2, 3, 4]# 配置开始位置、结束位置和步长
it = itertools.islice(range(100), 5, 15, 2)
>>> list(it): [5, 7, 9, 11, 13]

4、tee:分裂

tee函数可以将源迭代器分裂成多个独立的迭代器,分裂个数由第二个参数指定(默认为2)。如果分裂出的迭代器推进速度不一致,程序可能要用大量内存做缓冲,以存放进度落后的迭代器将来会用到的元素。

ori_it = [1, 2, 3, 4, 5]
it1, it2, it3 = itertools.tee(ori_it, 3)
>>> list(it1/it2/it3): [1, 2, 3, 4, 5]

即使用tee函数创建出了新迭代器,如果源迭代器被推进,新迭代器将不会再产出被推进的值。所以创建了新迭代器后,不建议再使用源迭代器

ori_it = iter([1, 2, 3, 4, 5])
it1, it2, it3 = itertools.tee(ori_it, 3)
next(ori_it), next(ori_it)
>>> list(it1/it2/it3): [3, 4, 5]

二、转换输入

1、map / starmap:函数映射

Python 内置的map函数能够将源迭代器中的值作为参数,调用映射函数并返回一个迭代器。任何一个源迭代器被耗尽时,map函数都会停止。

list1 = [1, 2, 3, 4, 5]
list2 = [0, 2, 4]result1 = map(lambda x: x**2, list1)
>>> list(result1): [1, 4, 9, 16, 25]def map_multiple(x, y):return x*y
result2 = map(map_multiple, list1, list2)
>>> list(result2): [0, 4, 12]

itertools模块中的starmap函数与map函数类似,但是它是使用*(unpacking)语法分解单个源迭代器中的元素作为映射函数的参数:

values = [(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]
it = itertools.starmap(lambda x, y: x*y, values)
>>> list(result1): [0, 6, 14, 24, 36]

可以通俗认为,传入map函数的映射函数名为f(it1, it2),而传入starmap函数的映射函数名为f(*it)

三、生成新值

1、count:生成连续整数

count函数能够无限地生成连续的整数,首个生成的整数可以通过第一个参数指定(默认为0)。count函数可以指定「开始位置」和「步长」参数,但是没有「结束位置」参数。

it = zip(itertools.count(), ['a', 'b', 'c'])
>>> list(it): [(0, 'a'), (1, 'b'), (2, 'c')]# -1 为起始整数,3 为步长
it = zip(itertools.count(-1, 3), ['a', 'b', 'c'])
>>> list(it): [(-1, 'a'), (2, 'b'), (5, 'c')]

2、repeat:单个值的重复

repeat函数可以不停地输出某个值,允许配置第二个参数times来限制输出次数:

it = itertools.repeat('hello', 5)
>>> list(it): ['hello', 'hello', 'hello', 'hello', 'hello']

3、cycle:某段内容的循环重复

cycle函数可以循环地重复输出源迭代器中的各项元素。由于必须记住源迭代器的全部内容,所以如果源迭代器很长,可能会耗费大量内存。

it = zip(range(7), itertools.cycle(['a', 'b', 'c']))
>>> list(it): [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'a'), (4, 'b'), (5, 'c'), (6, 'a')]

四、过滤

1、takewhile:获取元素直至 False

takewhile函数会一直从源迭代器中获取元素,直至判断函数返回False,停止输出该元素,也不会再判断后续元素:

it = itertools.takewhile(lambda x: x < 2, [-1, 0, 1, 2, -2])
>>> list(it): [-1, 0, 1]

2、dropwhile:跳过元素直至 False

takewhile函数相反,dropwhile函数会一直跳过源迭代器中的元素,直至判断函数返回False,开始输出该元素及后续元素(后续不再判断):

it = itertools.dropwhile(lambda x: x < 2, [-1, 0, 1, 2, -2])
>>> list(it): [2, -2]

3、filter / filterfalse:筛选每个元素

Python 内置的filter函数能够从源迭代器中筛选出判断函数返回True的元素,并返回一个迭代器。filter函数会测试每一个元素

it = filter(lambda x: x%2 == 0, [1, 2, 3, 4, 5])
>>> list(it): [2, 4]

itertools模块中的filterfalse函数恰好与filter函数相反,从源迭代器中筛选出判断函数返回False的元素。同样,filterfalse函数会测试每一个元素

it = itertools.filterfalse(lambda x: x%2 == 0, [1, 2, 3, 4, 5])
>>> list(it): [1, 3, 5]

4、compress:迭代器控制元素输出

compress函数使用第二个源迭代器的布尔元素来判断,对第一个源迭代器的元素是输出还是跳过。两个迭代器中的任何一个被耗尽,都会停止输出

it = itertools.compress(range(1, 10), [True, False, False, True, False])
>>> list(it): [1, 4]

五、数据分组

1、groupby:对连续相同元素分组

groupby函数用于对源迭代器中连续相同的元素进行分组,生成的迭代器每次生成一个(key, group)对,key是分组的键值,group是一个子迭代器,包含当前组的所有元素。

for key, group in itertools.groupby('AAAABBBCCD'):print(key, list(group))
>>> 输出结果:A ['A', 'A', 'A', 'A']B ['B', 'B', 'B']C ['C', 'C']D ['D']for key, group in itertools.groupby([('a', 1), ('a', 2), ('b', 3), ('b', 4), ('c', 5)], lambda x: x[0]):print(key, list(group))
>>> 输出结果:a [('a', 1), ('a', 2)]b [('b', 3), ('b', 4)]c [('c', 5)]

请注意,如果相同的元素不连续,会被分到不同的组。因此,如果要将所有相同的元素分组而不管是否连续,通常需要先对数据进行排序

for key, group in itertools.groupby([1, 2, 2, 3, 4, 4, 4, 1, 1, 3]):print(key, list(group))
>>> 输出结果:1 [1]2 [2, 2]3 [3]4 [4, 4, 4]1 [1, 1]3 [3]

六、合并输入

1、accumulate:元素累加

accumulate函数会对源迭代器中的元素进行累加,每次累加都会生成一个元素。可以指定表示累加逻辑的函数,该函数可以是任何的双参数函数,默认逻辑是两值相加。

it1 = itertools.accumulate(range(5))
>>> list(it1): [0, 1, 3, 6, 10]it2 = itertools.accumulate('abcde')
>>> list(it2): ['a', 'ab', 'abc', 'abcd', 'abcde']it = itertools.accumulate('abcde', lambda x, y: y + x + y)
>>> list(it): ['a', 'bab', 'cbabc', 'dcbabcd', 'edcbabcde']

accumulate函数和functools模块里的reduce函数类似,但是后者只会给出最终的累计值:

import functools
# result 等于 45
result = functools.reduce(lambda x, y: x + y, range(10))

2、product:笛卡尔积

product函数从一个或者多个源迭代器中获取元素,并计算笛卡尔积。它可以取代多层嵌套的for循环。要计算源迭代器与自身的积,可以使用参数repeat指定输入重复多少次。

single = itertools.product([1, 2], repeat=2)
>>> list(single): [(1, 1), (1, 2), (2, 1), (2, 2)]multiple = itertools.product([1, 2], ['a', 'c'])
>>> list(multiple): [(1, 'a'), (1, 'c'), (2, 'a'), (2, 'c')]

3、permutations:元素有序排列,M个元素中选N个

permutations函数将源迭代器中的元素以指定长度进行有序排列,默认(不指定长度)会生成所有排列的全集(长度为源迭代器中元素个数)。使用r参数指定所返回排列的长度。

it1 = itertools.permutations('abc')
>>> list(it1): [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]it2 = itertools.permutations('abc', r=2)
>>> list(it2): [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]

4、combinations:元素无序组合,M个元素中选N个

combinations函数将源迭代器中的元素以指定长度进行无序组合。与permutations函数不同的是,该函数的 r 参数是必要参数。只要源迭代器的元素取值是唯一的,输出就不会包含任何重复的值。

it = itertools.combinations('abca', r=2)
>>> list(it): [('a', 'b'), ('a', 'c'), ('a', 'a'), ('b', 'c'), ('b', 'a'), ('c', 'a')]

5、combinations_with_replacement:考虑自身元素的无序组合

combinations函数不同的是,combinations_with_replacement函数会将当前元素与「当前元素、所有的其他元素」均进行配对:

it = itertools.combinations_with_replacement('abcd', r=2)
>>> list(it): [('a', 'a'), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'b'), ('b', 'c'), ('b', 'd'), ('c', 'c'), ('c', 'd'), ('d', 'd')]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92773.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92773.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92773.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI论文】序列标注任务广义化研究(SFT广义化):基于奖励修正的强化学习视角

摘要&#xff1a;我们针对大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的监督微调&#xff08;Supervised Fine-Tuning&#xff0c;SFT&#xff09;提出了一种简单但具有理论依据的改进方法&#xff0c;以解决其与强化学习&#xff08;Reinforcemen…

(已解决)Mac 终端上配置代理

说明&#xff1a;为了便于理解&#xff0c;本文描述略显“抽象”与“潦草”&#xff0c;为了过审&#xff0c;仅供学习交流使用。&#x1f680; 简洁流程版启动工具 点击图标&#xff0c;复制它给出的终端命令将这段内容粘贴进你的配置文件中&#xff08;~/.zshrc 或 ~/.bash_p…

Anti-Aliasing/Mip-NeRF/Zip-NeRF/multi-scale representation

前言 CSDN的文章写太多&#xff0c;都不记得之前写的有什么了&#xff0c;但习惯了在这里记录&#xff0c;先写上吧。关于multi-scale representation又是看着忘着&#xff0c;还是写下点什么比较啊。时看时新&#xff0c;还是想吐槽自己看论文太不认真了。下面直接按照文章顺序…

板块三章节3——NFS 服务器

NFS 服务器 NFS 服务介绍 NFS 是Network File System的缩写&#xff0c;即网络文件系统&#xff0c;最早由Sun公司开发&#xff0c;**用来在UNIX&Linux系统间实现磁盘文件共享的一种方法。**它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS客户端&…

数学建模——最大最小化模型

1.概念最大最小化模型&#xff08;Maximin Model&#xff09;是一种优化方法&#xff0c;旨在最大化最坏情况下的收益或最小化最坏情况下的损失。常见的现实问题有&#xff1a;求最大值的最小化问题最大风险的最低限度最小化最坏情况下的损失等2.一般数学模型 (找最大值里面最小…

【JAVA】使用系统音频设置播放音频

代码直接可以运行 import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;public class SystemDefaultAudioPlayer {// 强制使用的通用音频格式private st…

[CSP-J 2021] 小熊的果篮

题目 12代码 #include <bits/stdc.h> using namespace std; const int N2e55; struct node{int pre,//上一个水果块(对于水果就是上个水果)l,//块开始的序号&#xff0c;左边界 d,//块类型&#xff0c;0/1id,//水果序号 r,//块结束的序号&#xff0c;右边界 next;//下一块…

【C++】STL二叉搜索树——map与set容器的基础结构

目录 前言 1.二叉搜索树的概念 1.1基本结构 1.2性能分析 2.二叉搜索树的实现 2.1创建 2.2插入 2.3查找与遍历 2.4删除 3.二叉搜索树类代码 前言 C中STL的map与set容器广泛应用于实践过程中&#xff0c;本文将详细分析容器最基础的二叉搜索树结构&#xff0c;为后续map…

基于Spring Boot和SSE的实时消息推送系统

一、SSE技术深度解析 1.1 协议工作原理 #mermaid-svg-u7ZBlEsXcn68R5a8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-icon{fill:#552222;}#mermaid-svg-u7ZBlEsXcn68R5a8 .error-text{fi…

Day 40 训练和测试的规范写法

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代…

分析代码并回答问题

代码 <template><div>Counter: {{ counter }}</div><div>Double Counter: {{ doubleCounter }}</div> </template><script setup lang"ts"> import { ref, computed } from "vue";const counter ref(0);const …

在macOS上扫描192.168.1.0/24子网的所有IP地址

在macOS上扫描192.168.1.0/24子网的所有IP地址&#xff0c;可以通过终端命令实现。以下是几种常用方法&#xff1a; 使用ping命令循环扫描 打开终端执行以下脚本&#xff0c;会逐个ping测试192.168.1.1到192.168.1.254的地址&#xff0c;并过滤出有响应的IP&#xff1a; for i …

Java基础05——类型转换(本文为个人学习笔记,内容整理自哔哩哔哩UP主【遇见狂神说】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)

Java基础05——类型转换 类型转换 由于Java是强类型语言&#xff0c;所以要进行有些运算的时候&#xff0c;需要用到类型转换。 如&#xff1a;byte(占1个字节)&#xff0c;short(占2个字节)&#xff0c;char(占2个字节)→int(4个字节)→long(占8个字节)→float(占4个字节)→do…

mysql基础(二)五分钟掌握全量与增量备份

全量备份 Linux环境 数据备份 数据库的备份与恢复有多中方法&#xff0c;通过mysql自带的mysqldump工具可对数据库进行备份。语法&#xff1a; mysqldump -u username -p password --databases db_name > file_name .sql说明&#xff1a; -u参数指定用户名&#xff0c;usern…

使用Windbg分析多线程死锁项目实战问题分享

目录 1、问题描述 2、使用.effmach x86命令切换到32位上下文 3、切换到UI线程&#xff0c;发现UI线程死锁了 4、使用!locks命令查看临界区锁的详细信息&#xff0c;遇到了问题 5、使用dt命令查看临界区对象信息&#xff0c;找到发生死锁的多个线程 6、用户态锁与内核态锁…

防火墙组网方式总结

一、部署模式&#xff1a;灵活适配多样网络环境下一代防火墙&#xff08;NGAF&#xff09;具备极强的网络适应能力&#xff0c;支持五种核心部署模式&#xff0c;可根据不同网络需求灵活选择。路由模式&#xff1a;防火墙相当于路由器&#xff0c;位于内外网之间负责路由寻址&a…

AI大模型:(二)5.1 文生视频(Text-to-Video)模型发展史

目录 1.介绍 2.发展历史 2.1.早期探索阶段(2015-2019) 2.1.1.技术萌芽期 2.1.2.RNN/LSTM时代 2.2.技术突破期(2020-2021) 2.2.1 Transformer引入视频生成 2.2.2 扩散模型的兴起 2.3.商业化突破期(2022-2023) 2.3.1 产品化里程碑 2.3.2 竞争格局形成 2.4.革命…

14mm寻北仪能否塞进液压支架生死缝隙?

在煤矿井下世界的方寸之间&#xff0c;液压支架的每个关键节点都承载着千钧重压。顶梁铰接点、立柱顶端、掩护梁角落&#xff0c;恰恰是空间最为局促的“禁区”。ER-MNS-10A MEMS寻北仪应运而生&#xff01;它采用了先进的MEMS陀螺技术&#xff0c;以14mm至薄高度、40g极致轻盈…

python之浅拷贝深拷贝

文章目录潜拷贝(shallow copy)深拷贝(deep copy)总结一下python的浅拷贝和深拷贝.潜拷贝(shallow copy) python中潜拷贝指的是:构造一个新的复合对象&#xff0c;然后将原对象中的对象引用插入其中 平常开发过程中潜拷贝是比深拷贝更常见的场景. 比如编程中使用到的一些基本的…

普通大学本科生如何入门强化学习?

问题:你平时是如何紧跟大型语言模型和智能体技术前沿的&#xff1f;有哪些具体的学习和跟踪方式&#xff1f;回答:我会通过“输入-内化-实践”结合的方式跟踪前沿。首先&#xff0c;学术动态方面&#xff0c;每天花10分钟浏览arXiv的http://cs.CL和http://cs.AI板块&#xff0c…