当前位置: 首页 > news >正文

Python Cookbook-4.4 循环访问序列中的元素和索引

任务

需要循环访问一个序列,并且每一步都需要知道已经访问到的索引(因为需要重新绑定序列的入口),但 Python 提供的首选的循环方式完全不用依赖索引。

解决方案

内建函数 enumerate 正是为此而生。看例子:

for index,item in enumerate(sequence):
	if item > 23:
		sequence[index] = transform(item)

它看上去很干净易读,而且比那种通过索引访问元素的方式快:

for index in range(len(sequence)):
	if sequence[index] > 23:
		sequence[index] = transform(sequence[index])

讨论

循环遍历一个序列是很常见的需求,Python强烈建议你用一种最直接的方式。事实上这也是最具有Python 风格的访间序列中每个元素的方式:

for item in sequence:
	process(item)

而其他一些典型的比较底层的语言,不是用这种直接的循环方式,而是通过序列的索引,根据索引找到每一个对应的子项:

for index in range(len(sequence)):
	process(sequence[index])

直接的循环方式更加干净、更易读、更快,而且也更通用(因为根据定义,此法可以应用于任何可迭代对象,而根据索引访问的方式则只适用于序列,如列表)。但是,有时候在循环中,你的确需要同时获得索引和索引对应的子项。一个常见的理由是,你想重新绑定列表的新入口,必须将thelist[index]赋值为一个新的子项。为了支持这种需求,Python 提供了内建函数 enumerate,它接受任何可迭代的参数,并返回一个迭代器,迭代器产生的是一个(两个子项的元组)形如(index,item)的结果,一次一项。因此你的 for 子句的头部可以写成:

for index,item in enumerate(sequence):

这样,在for的主体中,索引和子项都是可以访问的。
为了帮助你记忆 enumerate 产生的结果,考虑惯用法d=dict(enumerate(L))。实际上从某种意义上来讲,用此法获得的字典d是等价于列表L的,因为对于任意一个有效的非负索引i,d[i] is L[i]都成立。

相关文章:

  • 数据分布偏移检测:保障模型在生产环境中的稳定性
  • Debain-12.9使用xinference部署音频模型/audio
  • 非模态对话框
  • Linux内核IPoIB驱动中的RSS队列选择机制分析
  • Python算法竞赛实战解题策略与技巧
  • 011【fate/extra link】【概率论与数理统计】大数定律与中心极限定理 ,数理统计的基本概念,常用的统计三大分布,正态总体的抽样分布定理
  • 机器学习编译器(二)
  • TBOX+OTA+UDS
  • 《蓝耘容器全栈技术指南:企业级云原生与异构计算实战大全》
  • 深入理解C/C++堆数据结构:从原理到实战
  • R语言零基础系列教程-03-RStudio界面介绍与关键设置
  • Python----数据分析(Pandas二:一维数组Series,Series的创建,Series的属性,Series中元素的索引与访问)
  • STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构
  • 大模型token和字符串的关系
  • 深入理解 GPU 渲染加速与合成层
  • c语言笔记 作用域
  • python脚本实现服务器内存和cpu使用监控,并记录日志,可以设置阈值和采样频率
  • MySQL复习(检查本地MySQL是否安装、DataGrip数据库可视化工具使用、增删改查基础语法、唯一索引、SQL简单函数)
  • 单片机自学指南
  • Apifox Helper 自动生成API接口文档
  • 看着不爽就滚蛋!郑州大学第一附属医院一科室公众号被曝运营人员辱骂他人
  • 云南省政协原党组成员、秘书长车志敏接受审查调查
  • “五一”假期国铁集团计划日均开行旅客列车超1.2万列
  • 李公明︱一周书记:数字文化的乌托邦精神与……算法时代的生存指南
  • 乌美签署矿产协议
  • 北京亦庄启动青年人才创新创业生态示范区