Python中的 zip()和enumerate()详解

Python中的 zip 和 enumerate 详解

    • 1. `enumerate()` - 给可迭代对象添加索引
      • 基本用法
      • 示例
      • 实用场景
    • 2. `zip()` - 并行迭代多个序列
      • 基本用法
      • 示例
      • 特殊用法
    • 3. `zip()` 和 `enumerate()` 的组合使用
      • SIFT中的经典模式
      • 分解理解
      • 其他组合用法
    • 4. 高级技巧和注意事项
      • 迭代器消耗问题
      • 内存效率对比
      • 实际应用案例
    • 5. 在SIFT上下文中的具体解释
    • 练习示例
    • 总结

1.enumerate()- 给可迭代对象添加索引

基本用法

enumerate(iterable,start=0)
  • 返回一个枚举对象,产生(index, value)
  • start: 起始索引值,默认为0

示例

# 基本示例fruits=['apple','banana','cherry']forindex,fruitinenumerate(fruits):print(f"Index{index}:{fruit}")# 输出:# Index 0: apple# Index 1: banana# Index 2: cherry# 指定起始索引forindex,fruitinenumerate(fruits,start=1):print(f"#{index}:{fruit}")# 输出:# #1: apple# #2: banana# #3: cherry

实用场景

# 1. 需要索引时的循环students=['Alice','Bob','Charlie']fori,studentinenumerate(students):print(f"Student{i+1}:{student}")# 2. 创建字典映射position_dict={item:idxforidx,iteminenumerate(['gold','silver','bronze'])}# {'gold': 0, 'silver': 1, 'bronze': 2}# 3. 跟踪循环次数data=[process(x)forxinlarge_list]forcount,iteminenumerate(data,1):ifcount%100==0:print(f"Processed{count}items")

2.zip()- 并行迭代多个序列

基本用法

zip(*iterables)
  • 将多个可迭代对象"压缩"在一起
  • 返回一个迭代器,产生元组,每个元组包含每个可迭代对象的对应元素
  • 以最短的可迭代对象长度为基准

示例

# 基本示例names=['Alice','Bob','Charlie']scores=[85,92,78]forname,scoreinzip(names,scores):print(f"{name}:{score}")# 输出:# Alice: 85# Bob: 92# Charlie: 78# 三个列表一起zipages=[25,30,35]forname,score,ageinzip(names,scores,ages):print(f"{name}, age{age}:{score}")# zip结果转换为列表pairs=list(zip(names,scores))# [('Alice', 85), ('Bob', 92), ('Charlie', 78)]

特殊用法

# 1. 不等长列表 - 以最短的为准list(zip([1,2,3],['a','b']))# [(1, 'a'), (2, 'b')]# 2. 使用zip_longest处理不等长列表(需要itertools)fromitertoolsimportzip_longestlist(zip_longest([1,2,3],['a','b'],fillvalue='X'))# [(1, 'a'), (2, 'b'), (3, 'X')]# 3. 解压(unzip) - 使用*操作符pairs=[('a',1),('b',2),('c',3)]letters,numbers=zip(*pairs)# letters = ('a', 'b', 'c'), numbers = (1, 2, 3)# 4. 矩阵转置matrix=[[1,2,3],[4,5,6],[7,8,9]]transposed=list(zip(*matrix))# [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

3.zip()enumerate()的组合使用

SIFT中的经典模式

# 原代码模式forlayer,(image1,image2,image3)in\enumerate(zip(dog_images,dog_images[1:],dog_images[2:])):# layer是索引,image1,image2,image3是三个连续的图像

分解理解

dog_images=[img0,img1,img2,img3,img4,img5]# 第一步:创建三个偏移列表first=dog_images# [img0, img1, img2, img3, img4, img5]second=dog_images[1:]# [img1, img2, img3, img4, img5]third=dog_images[2:]# [img2, img3, img4, img5]# 第二步:zip组合zipped=zip(first,second,third)# 第一次: (img0, img1, img2)# 第二次: (img1, img2, img3)# 第三次: (img2, img3, img4)# 第四次: (img3, img4, img5)# 第三步:enumerate添加索引forindex,(a,b,c)inenumerate(zipped):print(f"组{index}:{a},{b},{c}")

其他组合用法

# 1. 带索引的多列表并行迭代names=['Alice','Bob','Charlie']ages=[25,30,35]scores=[85,92,78]fori,(name,age,score)inenumerate(zip(names,ages,scores)):print(f"{i}.{name}(age{age}):{score}")# 2. 创建带索引的字典列表people=[]fori,(name,age)inenumerate(zip(names,ages),1):people.append({'id':i,'name':name,'age':age})

4. 高级技巧和注意事项

迭代器消耗问题

# zip返回的是迭代器,只能消费一次zipped=zip([1,2,3],['a','b','c'])list(zipped)# [(1, 'a'), (2, 'b'), (3, 'c')]list(zipped)# [] - 已经被消耗# 解决方案:转换为列表或重新创建zipped=list(zip([1,2,3],['a','b','c']))# 或多次使用时重新创建

内存效率对比

# 传统方式(不推荐,创建临时列表)foriinrange(len(list1)):item1=list1[i]item2=list2[i]# ...# Pythonic方式(推荐,内存效率高)foritem1,item2inzip(list1,list2):# ...

实际应用案例

# 案例1:批量处理数据defprocess_batch(images,labels):results=[]fori,(img,label)inenumerate(zip(images,labels)):processed=preprocess_image(img)results.append((i,processed,label))returnresults# 案例2:创建训练批次defcreate_batches(data,batch_size=32):batches=[]foriinrange(0,len(data),batch_size):batch=data[i:i+batch_size]# 使用enumerate跟踪批次编号batches.append((i//batch_size,batch))returnbatches# 案例3:多列表同时排序names=['Bob','Alice','Charlie']scores=[85,92,78]# 按分数排序,同时保持名字和分数的对应关系sorted_pairs=sorted(zip(scores,names),reverse=True)# [(92, 'Alice'), (85, 'Bob'), (78, 'Charlie')]# 解压得到排序后的列表sorted_scores,sorted_names=zip(*sorted_pairs)

5. 在SIFT上下文中的具体解释

回到你的原始代码:

forlayer,(image1,image2,image3)in\enumerate(zip(dog_images,dog_images[1:],dog_images[2:])):

这行代码相当于:

# 手动实现等价代码num_images=len(dog_images)foriinrange(num_images-2):# 因为需要三个连续的图像layer=i# 当前组的索引image1=dog_images[i]# 当前组的第一张image2=dog_images[i+1]# 当前组的第二张(中间层)image3=dog_images[i+2]# 当前组的第三张# 处理逻辑...

但Pythonic版本的优点:

  1. 更简洁:一行代码完成多个操作
  2. 更安全:自动处理边界
  3. 更易读:明确表示"处理三个连续图像"

练习示例

# 自己动手试试data=['A','B','C','D','E']print("1. 基本的enumerate:")fori,iteminenumerate(data):print(f"{i}:{item}")print("\n2. zip三个偏移列表:")fori,(prev,curr,next_item)inenumerate(zip(data,data[1:],data[2:])):print(f" 组{i}: [{prev},{curr},{next_item}]")print("\n3. 实际应用:计算滑动平均值:")values=[1,2,3,4,5,6,7]fori,(a,b,c)inenumerate(zip(values,values[1:],values[2:])):avg=(a+b+c)/3print(f" 位置{i}的滑动平均:{avg:.2f}")

总结

  • enumerate():给循环添加索引,避免手动维护计数器
  • zip():并行迭代多个序列,处理相关数据
  • 组合使用:在处理多序列且需要索引时非常有用
  • Pythonic代码:更简洁、安全、易读

这两个函数是编写Pythonic代码的关键工具,熟练掌握能大大提高代码质量和开发效率。

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

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

相关文章

★★★求pi的近似值

Q401.(语言: C)用下列公式求pi的近似值,直到最后一项的绝对值小于1e-4为止(最后一项要加): π/4≈1-1/3+1/5-1/7 ....... **输入:无 **输出格式要求:"pi=%10.6f\n" 程序运行示例如下: pi= 3.141793 注…

从灵感到成品:我用这 20+ 个网站,把“想法”变成能发、能用、能送人的作品

你有没有过这种瞬间: 脑海里突然闪过一个画面——像纹身闪图一样干净利落;或者突然哼出一段节拍,越想越上头;又或者你很想给某个人留下些什么,但一到键盘前就只剩下“祝你快乐”。 我后来发现,很多时候我们缺的不…

救命神器!8款AI论文工具测评:本科生毕业论文全攻略

救命神器!8款AI论文工具测评:本科生毕业论文全攻略 2026年AI论文工具测评:为何要关注这些工具? 随着人工智能技术的不断进步,越来越多的本科生开始依赖AI论文工具来提升写作效率、优化内容质量。然而,面对市…

北京上门回收陈年茅台!京城亚南高价收老款茅台,专业鉴定有保障 - 品牌排行榜单

陈年茅台是很多收藏爱好者的心头好,也是老酒回收市场的“硬通货”。但陈年茅台鉴定难度大,回收价格差异也大,很多北京市民手里有陈年茅台想变现,却不知道找哪家专业。今天就给大家推荐京城亚南酒业,北京上门回收陈…

PCTF赛后补题

冈易云音乐 手玩软件,点开第一首歌,拖动进度条过半会出现登录页面弹窗,已经自动填好用户名 ”jjkk114514“。结合题目提示,这里的 ”激活码“ 就是 flag。 进入IDA分析,进字符串页面,尝试寻找与 ”用户名“ 或 ”…

助力金融信创与云原生转型,DeepFlow 排障智能体和可观测性建设实践 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

高价回收!北京本地上门收茅台五粮液,京城亚南酒业当场结算 - 品牌排行榜单

“家里有两瓶2020年的飞天茅台,想出手能卖多少钱?”“有没有北京本地能上门回收五粮液的靠谱商家?”最近很多北京网友都在问这类问题,今天就给大家推荐一家靠谱的——京城亚南酒业,北京本地上门回收茅台、五粮液,…

三种经典的智能体设计模型

1. ReAct (Reason + Act) 核心思想: ReAct将“推理(Reasoning)”与“行动(Acting)”紧密结合,形成一个“思考-行动-观察”的循环。这个范式通过不断地进行推理和实际操作,智能体能在每个步骤后更新自己的推理,…

年底变现高峰!北京上门回收茅台五粮液,京城亚南高价不压价 - 品牌排行榜单

年底到了,很多北京市民开始清理家里的闲置物品,其中就包括不少茅台、五粮液等名酒。年底也是老酒回收的高峰期,很多商家会趁机压价,让市民蒙受损失。在这里提醒大家,年底变现选对商家很重要,京城亚南酒业北京上门…

全栈开发者用 XinServer 实现快速接口开发

全栈开发者用 XinServer 实现快速接口开发 最近跟几个做前端的朋友聊天,发现一个挺普遍的现象:大家做项目,最头疼的往往不是前端页面有多复杂,而是后端那摊子事。一提到要自己搭服务器、设计数据库、写接口、搞权限、处理运维………

软件负责人的项目管理经验

文章目录前言一、项目全周期流程管理1.1 项目启动阶段:夯实基础1.2 项目规划阶段:谋定后动1.3 项目执行与监控阶段:动态调整1.4 项目收尾阶段:闭环与升华二、多维度项目管控三、团队领导与人员管理3.1 团队构建与氛围营造3.2 人员…

北京上门回收老酒!茅台五粮液高价变现,亚南酒业全程省心 - 品牌排行榜单

北京的朋友们注意了!家里有闲置的茅台、五粮液,或是压箱底的陈年老酒、洋酒,想变现又怕麻烦?别发愁,京城亚南酒业北京全域上门回收,让你足不出户就能轻松卖高价! 很多北京市民手里都有不少闲置名酒,要么是商务…

新中式高定服装哪家好?2026年热门品牌逐一揭秘,苏州排行前列的新中式高定服装设计色麦新中式显著提升服务 - 品牌推荐师

近年来,新中式高定服装市场热度持续攀升。从国际时装周到本土文化消费,融合东方美学与现代设计的服饰正成为高净值人群与时尚从业者的核心选择。据第三方机构统计,2025年中国新中式服装市场规模已突破300亿元,年复…

【工业树莓派 CM0 NANO 单板计算机】YOLO26 部署方案

【工业树莓派 CM0 NANO 单板计算机】YOLO26 部署方案 本文介绍了工业树莓派 CM0 NANO 单板计算机结合 OpenCV 和 Ultralytics 库实现 YOLO26 板端部署,并实现目标识别、姿态估计、图像分割、图像分类、旋转框检测的项目设计,包括环境部署、模型获取、关…

停止幻想!Java就业只会越来越难!

最近小伙伴在我后台留言是这样的:现在就这光景,不比以前,会个CRUD就有人要,即使大部分公司依然只需要做CRUD的事情......现在去面试,只会CRUD还要被吐槽:面试造火箭,工作拧螺丝,就是…

Product Hunt 每日热榜 | 2026-01-18

1. Sled 标语:在手机上通过语音启动你的编程助手。 介绍:Sled 让你可以通过手机的语音来运行你的编码助手。通常情况下,编码助手需要频繁的输入,但当你离开桌子时,它们就会闲置。Sled 通过提供一个安全的语音界面来解…

Zephyr 消息队列 接口与内部实现详解

第一章 设计背景与使用场景概述1.1 Zephyr 中的 IPC 设计哲学Zephyr 作为面向嵌入式与多核 SoC 的 RTOS,其内核对象(Kernel Object)在设计上强调:确定性(Determinism):操作复杂度可控&#xff0…

驱动数字贸易新增长:WEEX 宣布启动生态权益回馈计划第三期

【行业观察】 随着数字资产行业的深度发展,如何通过技术手段优化贸易成本、提升用户粘性成为平台竞争的核心。近日,WEEX 平台宣布正式启幕“数字贸易激励计划”第三期。继前两期圆满收官后,全新一期计划于 1 月 16 日正式启动,为期…

springboot博物馆管理系统设计开发实现

背景分析 博物馆作为文化遗产保护和展示的重要场所,传统管理模式面临数据分散、效率低下、游客体验不足等问题。数字化需求日益增长,需通过信息化手段提升管理效率和服务质量。 技术选型依据 Spring Boot框架因其快速开发、微服务支持和生态丰富性&am…

springboot的保护濒危动物公益网站系统设计实现

技术栈选择后端框架 采用Spring Boot作为核心框架,提供快速开发、自动配置和依赖管理。结合Spring Security实现用户认证与授权,确保系统安全性。数据库 使用MySQL或PostgreSQL存储用户信息、动物数据及公益活动记录。通过JPA或MyBatis实现数据持久化&am…