Python enumerate() 函数

Python enumerate() 语法

enumerate() 是 Python 的一个内置对象,它用于在遍历可迭代对象时,同时获取元素的索引和值。

语法:

enumerate(iterable, start=0)

说明:

enumerate() 函数接收以下 2 个参数。

  • iterable(必选):表示一个可迭代对象。
  • start(可选,默认值:0):表示从哪个数字开始计算。比如 start = 10,则表示从 10 开始计算。

enumerate() 函数会返回一个由元组组成的迭代器,每个元组包含 2 个元素:第 1 个元素是元素的索引,第 2 个元素是元素的值,即 (index, element)。

提示:

  • enumerate() 返回的是一个迭代器对象。这意味着它采用的是惰性求值,在需要时才生成元组,这对于处理大型数据集非常高效。
  • enumerate() 的主要优势是提高代码的可读性和简洁性,避免了手动管理索引变量的需要。

Python enumerate() 摘要

使用频率
时间复杂度 O(1)(创建迭代器本身)、O(n)(迭代 n 个元素)
官方文档 查看
相关函数 range()zip()iter()next()

Python enumerate() 示例

在遍历一个列表时,如果需要同时获取元素的索引以及值,常用有两种写法:① 使用 for 循环;② 使用 enumerate() 函数。

示例 1:使用 for 循环

colors = ['红', '绿', '蓝']
for i in range(len(colors)):
    print(i, colors[i])

运行结果如下。

01 绿
2

示例 2:使用 enumerate() 函数

colors = ['红', '绿', '蓝']
for index, color in enumerate(colors):
    print(index, color)

运行结果如下。

01 绿
2

示例 3:enumerate() 带 2 个参数

animals = ['ant', 'bee', 'cat', 'dog', 'ewe']
for index, animal in enumerate(animals, start=2):
    print(index, animal)

运行结果如下。

2 ant
3 bee
4 cat
5 dog
6 ewe

分析:

默认情况下,enumerate() 开始下标为 0,而 enumerate(animals, start = 2) 表示开始下标为 2。下面 2 种写法是等价的:

# 写法 1
enumerate(animals, start=2)

# 写法 2
enumerate(animals, 2)

示例 4:enumerate() 与 list() 结合使用

animals = ['ant', 'bee', 'cat', 'dog', 'ewe']
result = enumerate(animals, start=1)
print(list(result))

运行结果如下。

[(1, 'ant'), (2, 'bee'), (3, 'cat'), (4, 'dog'), (5, 'ewe')]

enumerate() 注意事项

虽然 enumerate() 函数功能强大且方便,但是在使用时仍然有几个重要的地方需要特别注意一下。

1. 迭代器不可重复使用

enumerate() 返回的是迭代器。而迭代器有一个重要特性:只能被遍历一次!一旦你遍历完一个 enumerate 迭代器,它就被 “耗尽” 了,并且无法再次使用。

如果想要再次遍历相同的数据,我们需要重新调用 enumerate() 来生成一个新的迭代器。

nums = [10, 20, 30]
result = enumerate(nums)
print(list(result))        # 输出:[(0, 10), (1, 20), (2, 30)]
print(list(result))        # 输出空列表,迭代器已耗尽

2. 性能优势

相比于 range(len()) 这种写法,enumerate() 函数可以直接获取元素,避免通过索引重复访问容器,效率会更高。

enumerate() 与其他方式对比
方法 特点 适用场景
for i in range(len(x)) 需通过索引访问元素,代码冗余 需要严格控制索引步长时
enumerate(x) 直接获取索引和元素,代码简洁高效 同时需要索引和元素的循环操作
zip() 并行迭代多个可迭代对象 合并处理多个数据集时

上一篇: reduce()

下一篇: all()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号