enumerate 的用法
enumerate 的用法enumerate 是 Python 内置函数作用是在遍历可迭代对象时同时获取索引和值。基本语法enumerate(iterable,start0)返回(index,value)元组start 指定起始索引默认0。 简单示例 words[Hello,world,this,is,a,test]不用 enumerate手动维护索引i0forwordinwords:print(i,word)i1用 enumerate一行搞定fori,wordinenumerate(words):print(i,word)输出0Hello1world2this3is4a5test在 Ch02 中的实际用例你打开的文件中就有大量使用构建词汇表token → ID 映射ch02.ipynb: 把排好序的唯一 token 列表映射为数字vocab{token:integerforinteger,tokeninenumerate(all_words)}效果: {“!”: 0, ‘’: 1, “”: 2, “(”: 3, …}查看词汇表前 51 项fori,iteminenumerate(vocab.items()):print(item)ifi50:break扩展词汇表重新编号all_tokenssorted(list(set(preprocessed)))all_tokens.extend([|endoftext|,|unk|])vocab{token:integerforinteger,tokeninenumerate(all_tokens)}|endoftext| → 1130, |unk| → 1131常见模式 场景 写法 列表 → 字典ID 映射{item:ifori,iteminenumerate(items)}遍历带序号fori,valinenumerate(seq):从1开始计数fori,valinenumerate(seq,start1):只取值但记录位置[ifori,vinenumerate(lst)ifvtarget]对比range(len())❌ 老式写法不推荐foriinrange(len(words)):print(i,words[i])✅ Pythonic 写法fori,wordinenumerate(words):print(i,word)enumerate更简洁、更易读而且适用于任何可迭代对象不仅限于有len()的序列。enumerate详解1.本质它是一个包装器# enumerate 不返回列表返回一个迭代器对象words[Hello,world,test]resultenumerate(words)print(result)# enumerate object at 0x...print(type(result))# class enumerate它不是一次性生成所有(index,value)对而是惰性计算——每次next()才产生下一对所以省内存。2.内部工作原理# enumerate 的等价实现简化版defmy_enumerate(iterable,start0):countstartforiteminiterable:yield(count,item)count1# 因此可以这样拆解eenumerate([a,b,c])print(next(e))# (0, a)print(next(e))# (1, b)print(next(e))# (2, c)print(list(e))# [] — 迭代器耗尽后续为空关键理解enumerate对象是一次性的迭代器。这和列表不同 eenumerate([a,b])list(e)# [(0, a), (1, b)]list(e)# [] ← 第一次已经消耗完了3.元组拆包enumerate产生的每个元素是(index,value)元组所以可以三种方式接收forpairinenumerate([x,y]):# pair (0, x)print(pair[0],pair[1])fori,vinenumerate([x,y]):# 直接拆包 ← 最常用print(i,v)fori_v_tupleinenumerate([x,y]):# 如果只想用一个变量i,vi_v_tuple# 手动拆包4.start 参数的实际用途# start1显示为人类习惯的第 1 行forline_no,textinenumerate(lines,start1):print(f第{line_no}行:{text})# start某个 ID 偏移量特殊 token 接在词汇表后面all_tokens[!,A,the]# 0~2all_tokens.extend([|unk|])# 索引 3vocab{t:ifori,tinenumerate(all_tokens)}# {!: 0, A: 1, the: 2, |unk|: 3}5.字典推导式详解Ch02 核心模式 all_words[!,,,the,hello]vocab{token:integerforinteger,tokeninenumerate(all_words)}# ↑key ↑value ↑index ↑item# 一步步拆解# 第 1 轮: integer0, token! → {!: 0}# 第 2 轮: integer1, token → {: 1}# 第 3 轮: integer2, token → {: 2}# 第 4 轮: integer3, tokenthe → {the: 3}# 第 5 轮: integer4, tokenhello → {hello: 4}注意字典推导式中 integer 和 token 的位置值写在前面 token:integerenumerate产出的 integer 被用作字典的 value。6.常见进阶用法 sentenceI HAD always thought Jack.split()# 同时获取索引、值、值的长度fori,wordinenumerate(sentence):print(i,word,len(word))# 只在特定条件下使用索引target_indices[ifori,wordinenumerate(sentence)ifwordJack]# [3]# enumerate zip 同时遍历多个序列a[a,b,c]b[1,2,3]fori,(x,y)inenumerate(zip(a,b)):print(f[{i}]{x}-{y})# 嵌套 enumeratematrix[[a1,a2],[b1,b2]]forrow_idx,rowinenumerate(matrix):forcol_idx,valinenumerate(row):print(f({row_idx},{col_idx}):{val})# (0,0): a1 (0,1): a2 (1,0): b1 (1,1): b27.对比所有替代方案 seq[a,b,c]# ❌ 方式1: range len — Java/C 思维不 Pythonicforiinrange(len(seq)):print(i,seq[i])# ❌ 方式2: 手动计数器 — 啰嗦容易遗漏 i1i0foriteminseq:print(i,item)i1# ✅ 方式3: enumerate — 标准写法fori,iteminenumerate(seq):print(i,item)enumerate的优势 不需要对象有len()比如文件对象、生成器 不需要支持索引[]比如set、dict.keys() 一行完成不会忘记 i18.常见陷阱# 陷阱1: 在循环中修改列表会导致索引错乱words[a,b,c]fori,winenumerate(words):ifwb:delwords[i]# ⚠️ 危险enumerate 不知道列表变了# 建议遍历副本或收集要删除的索引# 陷阱2: enumerate 不可重复消费eenumerate([1,2,3])list(e)# [(0, 1), (1, 2), (2, 3)]list(e)# [] ← 第二次是空的# 陷阱3: 字典生成时顺序没保证Python 3.6-# Python 3.7 字典保持插入顺序所以 vocab {t: i for i, t in enumerate(all_words)}# 中 ID 的分配顺序和 all_words 的顺序一致一句话总结enumerate(iterable,start0)在遍历时同时给你索引和值。在 Ch02 里它最重要的用途就是把单词列表变成{单词:数字ID}的词汇表字典。

相关新闻

Excel VBA调试技巧:解决宏被禁用、公式不更新等15个常见问题

Excel VBA调试技巧:解决宏被禁用、公式不更新等15个常见问题

Excel VBA调试技巧:解决宏被禁用、公式不更新等15个常见问题 【免费下载链接】concise-excel-vba Excel-vba 开发使用手册 项目地址: https://gitcode.com/gh_mirrors/con/concise-excel-vba Excel VBA是提升办公效率的强大工具,但新手常因调试问…

2026/10/13 23:01:12 阅读更多 →
TI C2000 MCU Control Center Clinic:运行时诊断工具原理与实战指南

TI C2000 MCU Control Center Clinic:运行时诊断工具原理与实战指南

1. 项目概述与核心价值在嵌入式开发的深水区摸爬滚打十几年,我见过太多因为配置错误导致的“灵异事件”:代码逻辑明明没问题,但系统就是跑飞了;通信时好时坏,查了半天发现是波特率算错了;更头疼的是&#x…

2026/10/13 23:00:39 阅读更多 →
如何使用CocoaPods-Rome快速生成动态框架?完整安装与配置指南

如何使用CocoaPods-Rome快速生成动态框架?完整安装与配置指南

如何使用CocoaPods-Rome快速生成动态框架?完整安装与配置指南 【免费下载链接】Rome Makes it easy to build a list of frameworks. 项目地址: https://gitcode.com/gh_mirrors/rome1/Rome CocoaPods-Rome是一款强大的CocoaPods插件,能够帮助开发…

2026/10/9 20:15:21 阅读更多 →

最新新闻

Django+LLM+遗传算法:打造AI驱动的旅游路线规划与推荐系统

Django+LLM+遗传算法:打造AI驱动的旅游路线规划与推荐系统

每年毕业设计的选题库里,“旅游网站”几乎是大热门,但说实话,十个里面至少有八个做成了标准的增删改查演示——用户注册登录、景点列表、后台维护,顶多再加一个关键字搜索。答辩的时候老师问一句“技术亮点在哪里”,很…

2026/10/13 23:01:16 阅读更多 →
PyBullet物理仿真入门:刚体模型创建、URDF加载与多体组装实战指南

PyBullet物理仿真入门:刚体模型创建、URDF加载与多体组装实战指南

1. 从零理解 pybullet 的模型体系pybullet 这个物理仿真库,刚上手的人最容易卡在“怎么把东西放进场景里”这一步。官方文档给了一堆 API,但真正落到项目里,你会发现创建模型这件事远比想象中要讲究。我最初接触 pybullet 的时候,…

2026/10/13 23:01:16 阅读更多 →
BERT预训练模型句向量与词向量提取:从[CLS]到池化的避坑指南

BERT预训练模型句向量与词向量提取:从[CLS]到池化的避坑指南

简介:面向自然语言处理初学者与开发者,这份压缩包提供一套基于BERT预训练模型生成句向量与词向量的轻量实践脚本,解决从模型加载到向量抽取的关键流程。BERT采用Transformer双向编码结构,能充分捕捉词语的上下文语义,这…

2026/10/13 23:01:16 阅读更多 →
Qt编译MySQL驱动完整指南:解决QMYSQL driver not loaded

Qt编译MySQL驱动完整指南:解决QMYSQL driver not loaded

如果你在 Qt 里写过QSqlDatabase::addDatabase("QMYSQL"),大概率见过这行让人头疼的输出:QSqlDatabase: QMYSQL driver not loaded。即便把官方 SDK 完整装了一遍,插件目录里也只有 qsqlite、qsqlodbc 那几个 dll,唯独没…

2026/10/13 23:01:16 阅读更多 →
AnyPS5项目解析:PS5手柄协议与Linux HID驱动适配

AnyPS5项目解析:PS5手柄协议与Linux HID驱动适配

我无法基于当前输入内容生成符合要求的博文。原因如下:输入中仅提供了项目标题"AnyPS5",但未提供任何实质性的【项目正文】、【关键词】或【摘要描述】;所谓“相关热搜词”和“最新网络热词”字段为空,无实际文本&#…

2026/10/13 23:01:15 阅读更多 →
Oracle 实战速查:表空间、索引与 PL/SQL 避坑指南

Oracle 实战速查:表空间、索引与 PL/SQL 避坑指南

简介:这份PDF面向Oracle数据库初学者与需要系统梳理基础知识的开发、运维人员,围绕表管理、SQL查询、事务、索引、权限角色、表空间与数据字典、PL/SQL编程等核心主题展开,帮助读者从建库建表到编写过程、函数、触发器逐步建立完整知识框架。…

2026/10/13 23:00:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →