python模块百科_为高效而生_itertools【三】

python模块百科_为高效而生_itertools【三】

  • 一、itertools --- 为高效而生
  • 二、无穷迭代器
  • 三、根据最短输入序列长度停止的迭代器
    • 3.6 groupby()
    • 3.7 islice()
    • 3.8 starmap()
    • 3.9 takewhile()
    • 3.10 tee()

一、itertools — 为高效而生


itertools — 为高效而生。itertools模块实现一系列迭代器 ,这些迭代器受到APL,Haskell、SML几种语言的启发。

itertools模块标准化了一个快速、高效利用内存的核心工具集,这些工具本身或组合都很有用。它们一起形成了“迭代器代数”,这使得在纯Python中有可能创建简洁又高效的专用工具。

例如,SML有一个制表工具: tabulate(f),它可产生一个序列 f(0), f(1), ...。在Python中可以组合 map()count() 实现: map(f, count())

这些工具及其内置对应物也能很好地配合 operator 模块中的快速函数来使用。 例如,乘法运算符可以被映射到两个向量之间执行高效的点积: sum(starmap(operator.mul, zip(vec1, vec2, strict=True)))

二、无穷迭代器

迭代器实参结果示例
count()[start[, step]]start, start+step, start+2step, …count(10) --> 10 11 12 13 14 ...
cycle()pp0, p1, … plast, p0, p1, …cycle('ABCD') --> A B C D A B C D ...
repeat()elem [,n]elem, elem, elem, … 重复无限次或n次repeat(10, 3) --> 10 10 10

三、根据最短输入序列长度停止的迭代器

迭代器实参结果示例
accumulate()p [,func]p0, p0+p1, p0+p1+p2, …accumulate([1,2,3,4,5]) --> 1 3 6 10 15
chain()p, q, …p0, p1, … plast, q0, q1, …chain('ABC', 'DEF') --> A B C D E F
chain.from_iterable()iterable – 可迭代对象p0, p1, … plast, q0, q1, …chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
compress()data, selectors(d[0] if s[0]), (d[1] if s[1]), …compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
dropwhile()pred, seqseq[n], seq[n+1], … 从pred首次真值测试失败开始dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
filterfalse()pred, seqseq中pred(x)为假值的元素,x是seq中的元素。filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
groupby()iterable[, key]根据key(v)值分组的迭代器
islice()seq, [start,] stop [, step]seq[start:stop:step]中的元素islice('ABCDEFG', 2, None) --> C D E F G
starmap()func, seqfunc(seq[0]), func(seq[1]), …starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
takewhile()pred, seqseq[0], seq[1], …, 直到pred真值测试失败takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
tee()it, nit1, it2, … itn 将一个迭代器拆分为n个迭代器
zip_longest()p, q, …(p[0], q[0]), (p[1], q[1]), …zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-

3.6 groupby()

itertools.groupby() 是一个 Python 内置函数,它可以对可迭代的对象进行分组。这个函数有两个主要参数:一个可迭代的对象和一个键函数。键函数定义了如何将可迭代对象的元素分组。

示例1: 列表奇偶分组

from itertools import groupby
# 创建一个数字列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 定义一个函数,用于将数字按奇偶分组
def key_func(n):return n % 2 == 0
# 使用 groupby() 对数字进行分组
for key, group in groupby(numbers, key_func):print(f'key={key}, value = {list(group)}')
# 执行结果
key=False, value = [1]
key=True, value = [2]
key=False, value = [3]
key=True, value = [4]
key=False, value = [5]
key=True, value = [6]
key=False, value = [7]
key=True, value = [8]
key=False, value = [9]
key=True, value = [10]

示例2: 字符串长度分组

from itertools import groupby
words = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig', 'grape']
def key_func(word):return len(word)
for key, group in groupby(words, key_func):print(f'Length {key}: {list(group)}')
# 执行结果
Length 5: ['apple']
Length 6: ['banana', 'cherry']
Length 4: ['date']
Length 10: ['elderberry']
Length 3: ['fig']
Length 5: ['grape']

示例3: 字母分组

from itertools import groupby
letters = ['at', 'bi', 'bc', 'bd', 'ei', 'fe', 'ga', 'gh', 'gi', 'jd']
def key_func(letter):return letter[0]
for key, group in groupby(letters, key_func):print(f'First letter {key}: {list(group)}')
# 执行结果
First letter a: ['at']
First letter b: ['bi', 'bc', 'bd']
First letter e: ['ei']
First letter f: ['fe']
First letter g: ['ga', 'gh', 'gi']
First letter j: ['jd']

3.7 islice()

itertools.islice() 可以从一个迭代器中获取切片

示例1: 无穷迭代器前10个数,下10个数中后5个

from itertools import count, islice
# 创建一个无限递增的数字迭代器
numbers = count(1)
# 使用 islice() 获取前10个数字
first_ten_numbers = islice(numbers, 10)
# 打印前10个数字
print(list(first_ten_numbers))
# 使用 islice() 截取下10个数字中的后5个
first_ten_numbers = islice(numbers, 5, 10)
# 打印这5个数字
print(list(first_ten_numbers))
# 执行结果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[16, 17, 18, 19, 20]

示例2: 10以下素数迭代10次

from itertools import islice, cycledef generate_primes(n):def is_prime(num):if num < 2:return Falsefor i in range(2, int(num ** 0.5) + 1):if num % i == 0:return Falsereturn Truereturn islice(cycle((x for x in range(2, n) if is_prime(x))), n)print(list(generate_primes(10)))
# 执行结果
[2, 3, 5, 7, 2, 3, 5, 7, 2, 3]

3.8 starmap()

itertools.starmap() 是 Python 的一个内置函数,它用于将一个可迭代对象的元素作为参数传递给一个函数,并返回函数的迭代器。

示例 1:执行多个函数

from itertools import starmapdef func1(a, b):return a + bdef func2(a, b):return a * bnumbers = [(1, 2), (3, 4), (5, 6)]
result1 = list(starmap(func1, numbers))
result2 = list(starmap(func2, numbers))
print(result1)  
print(result2)  
# 执行结果
[3, 7, 11]
[2, 12, 30]

示例 2:将多个列表的元素作为参数传递给函数

from itertools import starmap, zip_longestdef add_elements(a, b):return a + blist1 = [1, 2, 3]
list2 = [4, 5, 6]
zipped = list(zip_longest(list1, list2))  # 使用 None 填充较短的列表
result = list(starmap(add_elements, zipped))
print(result)  
# 执行结果
[5, 7, 9]

示例 3:在多线程应用中并行处理数据

from itertools import starmap, islice
from concurrent.futures import ThreadPoolExecutor
def process_data(data):# 这里可以执行一些耗时的数据处理任务return data * 2with ThreadPoolExecutor() as executor:data = range(100)  # 大量的数据需要处理chunk_size = 10  # 将数据分成小块进行处理以提高效率chunks = list(islice(data, chunk_size))  # 将数据分成块print(chunks)chunkslist = [[x] for x in chunks]results = list(starmap(process_data, chunkslist))  # 使用 starmap() 将块传递给处理函数并收集结果print(results) 
# 执行结果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

3.9 takewhile()

itertools.takewhile() 可以从一个迭代器中取出元素,直到满足某个条件为止。以下是代码示例:

示例1: 取出列表中小于5的数

import itertools
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = list(itertools.takewhile(lambda x: x < 5, numbers))
print(result)
numbers = [8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = list(itertools.takewhile(lambda x: x < 5, numbers))
print(result)
# 执行结果
[1, 2, 3, 4]
[]

示例2: 取连续小写字母

import itertools
text = "HelloWorld"
result = list(itertools.takewhile(lambda x: x.islower(), text))
print(result)
text = "helloWorld"
result = list(itertools.takewhile(lambda x: x.islower(), text))
print(result)
# 执行结果
[]
['h', 'e', 'l', 'l', 'o']

3.10 tee()

itertools.tee() 用于复制迭代器。这意味着你可以得到原始迭代器的多个副本,这些副本可以独立地迭代。

示例1: 复制一个字符串的多个副本

import itertools
s = "hello"
t1, t2 = itertools.tee(s)
print(list(t1))  
print(list(t2)) 
# 执行结果
['h', 'e', 'l', 'l', 'o']
['h', 'e', 'l', 'l', 'o']

**示例2:**生成多个斐波那契数列的副本

import itertools
def fibonacci(n):a, b = 0, 1i = 0while i < n:yield aa, b = b, a + bi += 1
fib_seq1, fib_seq2, fib_seq3 = itertools.tee(fibonacci(5), 3)  # 创建斐波那契数列的三个副本
print(list(fib_seq1))  
print(list(fib_seq2)) 
print(list(fib_seq3))
# 执行结果
[0, 1, 1, 2, 3, 5]
[0, 1, 1, 2, 3, 5]
[0, 1, 1, 2, 3, 5]

may the odds be ever in your favor ~

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

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

相关文章

Ant for Blazor做单个表的增删查改

Ant for Blazor做单个表的增删查改 2024年02月27日花了一天时间弄出来了&#xff0c;基本弄好了&#xff0c;vs2022blazor servernet8,引用的AntDesign版本是0.17.4 代码里的model和repository是用自己牛腩代码生成器生成的东西&#xff0c;sqlsugar的&#xff0c;记得在prog…

括号生成(力扣题目22)

题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()&q…

Modern C++ std::any的实现原理

1. 前言 std::any 是 C17 中引入的一个新特性&#xff0c;它是一个类型安全的容器&#xff0c;可以在其中存储任何类型(但此类型必须可拷贝构造)的值&#xff0c;包括基本类型、自定义类型、指针等。相比于void* 指针&#xff0c;std::any 更为类型安全&#xff0c;可以避免由…

NC65 rest接口 开发 NC65接口开发

一、在对应模块META-INF下编写 xxx.rest 文件,也要放在Home里对应的目录下。 二、开发接口&#xff0c;继承extends AbstractUAPRestResource&#xff0c;&#xff08;有的项目会继承别的方法如&#xff1a;AbstractNCCRestResource&#xff0c;MTFRestResource&#xff1b;有…

网络安全面试题

1. Http 状态码&#xff0c;Http2 是什么 答案&#xff1a; 200 欢迎回来&#xff0c;主人 &#xff08;正常&#xff1b;请求已完成。&#xff09; 301 人家搬家了 &#xff08;已移动 — 请求的数据具有新的位置且更改是永久的。&#xff09; 307 不是这里&#xff0c;换个…

使用 kubeadm 部署k8s集群

一、所有节点系统初始化 1、常规初始化 2、内核版本升级以及内核限制文件参数修改 还可以考虑将旧版本的内核卸载 二、准备nginx负载均衡器和keepalived nginx四层代理&#xff1a; keepalived配置&#xff1a; nginx检测脚本&#xff1a; 三、所有节点部署docker&#xff0c…

SQL函数学习记录

聚合函数 函数是编程语言的基础之一&#xff0c;在对数字的运算中&#xff0c;我们用的最多的就是聚合函数&#xff0c;本篇接下来就详细阐述下SQL中聚合函数的运用。 什么是聚合函数&#xff08;aggregate function&#xff09;&#xff1f; 聚合函数指的是对一组值执行计算…

2023秋季飞书未来无限大会--随笔

这个时代的飞书 数字时代 工作协同平台 AI时代 帮助企业和个人用好AI 企业如何引用大模型能力&#xff1f; 智慧体— 接近人&#xff0c;有进步空间智能伙伴 用时代的科技打造爱不释手的好产品 移动互联网 – 改变信息分发方式 大模型 –自然的人机交互方式 业务协同 …

如何使用便签快速分类工作待办事项

在日常工作和生活中&#xff0c;我们经常需要处理各种各样的待办事项。而有效地分类这些任务&#xff0c;可以帮助我们更好地管理时间和提高工作效率。使用便签是一种简单而实用的方法&#xff0c;下面将介绍如何利用好用便签来快速分类工作待办事项。 首先&#xff0c;你可以…

【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)

目录 1.前言&#xff1a;顺序表回顾&#xff1a; 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…

【前端素材】推荐优质后台管理系统Salreo平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 结构层次 在结构层次上&#xff0c;后台管理系统可以分为以下几个部分&#xff1a; a. 辅助功能模块&#…

Mycat核心教程--ZooKeeper集群搭建【三】

Mycat核心教程--ZooKeeper集群搭建 八、 ZooKeeper集群搭建8.1.ZooKeeper简介8.2.数据复制的好处8.3.Zookeeper设计目的8.4.zookeeper集群包括3种角色8.4.1.Leader角色8.4.2.Follower 角色8.4.3.Observer 角色 8.5.zookeeper集群工作流程8.6.zookeeper集群节点数量为奇数&#…

JS进阶——深入对象

版权声明 本文章来源于B站上的某马课程&#xff0c;由本人整理&#xff0c;仅供学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识…

FPS游戏之漫谈延迟补偿技术

在FPS游戏中&#xff0c;延迟补偿是一种常用的技术&#xff0c;用于解决由于网络延迟导致的玩家体验不一致的问题。对于投掷手雷这样的动作&#xff0c;延迟补偿的具体策略可能包括以下几个方面&#xff1a; 时间回溯&#xff08;Lag Compensation&#xff09;&#xff1a;服务…

liunx操作系统 进程的基本概念

进程的基本概念 计算机结构体系冯诺依曼 操作系统的管理进程进程的特性标识符系统的调用 创建新的进程 进程的状态进程队列进程的状态在liunx查看进程状态、 计算机结构体系 冯诺依曼 在没有存储器之前&#xff0c;所有的信息都是直接进入CPU&#xff0c;这样效率很差&#xf…

智慧公厕:打造智慧城市环境卫生新标杆

随着科技的不断发展和城市化进程的加速推进&#xff0c;智慧城市建设已经成为各地政府和企业关注的焦点。而作为智慧城市环境卫生管理的基础设施&#xff0c;智慧公厕的建设和发展也备受重视&#xff0c;被誉为智慧城市的新标杆。本文以智慧公厕源头厂家广州中期科技有限公司&a…

【Zotero插件】zotero better notes与zotcard联合使用 | 学习资源整理

整体学习&#xff1a; zotero官网&#xff1a;Zotero | Your personal research assistant 官网插件入口&#xff1a;plugins [Zotero Documentation] 初步学习zotero&#xff1a; 【Zotero零基础保姆级教程】 https://www.bilibili.com/video/BV1o3411Q7JQ/?share_source…

Java代码实现获取本机服务的IP地址

要通过Java代码获取一个IP地址的信息&#xff0c;你可以使用多种方法。其中一种常见的做法是通过IP地址查询服务API来获取详细信息&#xff0c;比如地理位置、ISP&#xff08;互联网服务提供商&#xff09;等。这里有一个简单的例子&#xff0c;展示如何使用Java代码调用一个公…

RRT算法学习及MATLAB演示

文章目录 1 前言2 算法简介3 MATLAB实现3.1 定义地图3.2 绘制地图3.3 定义参数3.4 绘制起点和终点3.5 RRT算法3.5.1 代码3.5.2 效果3.5.3 代码解读 4 参考5 完整代码 1 前言 RRT&#xff08;Rapid Random Tree&#xff09;算法&#xff0c;即快速随机树算法&#xff0c;是LaVa…

Latex中大括号书写多行方式【已解决】

在写论文时需要写一个非1即0的公式&#xff0c;因此写了这篇文章。 本文主要分为两个部分&#xff1a;1.在括号外赋值、2、在括号内赋值 1.在括号外赋值 示例 \begin{equation}A\begin{cases}1x, x \textgreater 0\\1-x, x \leq 0 \end{cases} \label{KD} \end{equation} 效…