什么是 enumerate() 函式?
是一个工具,可以迭代/遍历一个可迭代对象,然后产出隐性的索引和值的元组。
enumerate() 函式是一个内建的 Python 函式,用于在迭代一个可迭代对象(如列表、元组、字符串等)时,同时得到元素的隐性索引和值的元组。它会返回一个 enumerate object,该对象可以被迭代,每次迭代返回一个包含索引和值的元组。
enumerate object 的特性:
- 迭代器: 它是一种迭代器,可以被用在 for 迴圈中。
- 索引开始值: 可以通过 start 参数指定索引的起始值,默认从 0 开始。
- 懒惰求值: enumerate object 只有在需要的时候才会计算下一个元素,这有助于提高效率。
enumerate() 函式的语法enumerate(iterable, start=0)
- iterable: 要迭代的可迭代对象。
- start: 索引开始的值,默认为 0。
fruits = [\'apple\', \'banana\', \'cherry\']
for index, fruit in enumerate(fruits):
print(index, fruit)
输出结果:
0 apple
1 banana
2 cherry
enumerate() 的常见用法
- 在 for 迴圈中同时获取索引和值: 这是 enumerate() 最常见的用法,它可以让我们在遍历一个序列时,方便地跟踪当前元素的索引。
- 创建字典: 将 enumerate() 的结果与 zip() 函式结合,可以快速创建一个字典,其中键为索引,值为对应的元素。
- 其他应用: enumerate() 还可以用于许多其他场景,例如:
- 在列表推导式中使用
- 与其他函式结合使用,如 map()、filter() 等
enumerate() 的优点
简洁: 相比于手动维护一个计数器,enumerate() 提供了一种更简洁的方式来获取索引和值。易读: enumerate() 的语法直观,易于理解。灵活: 可以自定义索引的起始值。
更多示例
# 指定索引从 1 开始
for index, char in enumerate("hello", start=1):
print(index, char)
# 创建一个字典
fruits = [\'apple\', \'banana\', \'cherry\']
fruit_dict = dict(enumerate(fruits))
print(fruit_dict) # 输出:{0: \'apple\', 1: \'banana\', 2: \'cherry\'}
为什么要使用 dict()?
dict(...):这个部分会将 enumerate() 产生的元组转换成一个字典。字典是由键值对组成的,每个元组的第一个元素(索引)会作为字典的键,第二个元素(水果名称)会作为字典的值。
- 为什么要转换成字典?
- 方便索引: 将水果名称与索引关联起来,方便我们通过索引直接获取对应的水果名称。
- 快速查找: 字典的查找效率很高,可以快速根据索引找到对应的值。
- 其他操作: 字典提供了丰富的操作方法,例如添加、删除、修改键值对等。
fruit_dict = dict(enumerate(fruits))
print(fruit_dict[\'apple\']) # 输出:Traceback (most recent call stack) ... KeyError: \'apple\'
print(fruit_dict[0]) # 输出:apple
这个例子中,我们将 enumerate() 的结果转换为字典,以便快速根据索引查找对应的水果。
- 错误示范: 直接用水果名称作为键去查找会报错,因为字典的键是索引。
- 正确用法: 应该用索引作为键去查找对应的水果名称。
何时不需要转换成字典 使用 dict(enumerate(fruits))?
- 只需要迭代: 如果只是想顺序地遍历每个元素,并不需要根据索引来查找,那么直接使用 for 迴遍历 enumerate() 产生的元组即可。
- 记忆体限制: 如果序列非常长,将其转换为字典可能会占用过多的记忆体。
- 不需要修改: 如果不需要对索引-值对进行修改,那么使用元组或列表可能更适合。举例说明:
fruits = [\'apple\', \'banana\', \'cherry\']
fruit_counts = {}
for index, fruit in enumerate(fruits):
fruit_counts[fruit] = fruit_counts.get(fruit, 0) + 1
这个例子中,我们不需要将 enumerate() 的结果转换为字典,而是直接使用 for 迴圈来统计每个水果出现的次数。
如何将 enumerate() 与 zip() 结合,快速创建一个字典:
Python 内建函式 zip() & [list] 运用
复杂的资料结构
students = [\'Alice\', \'Bob\', \'Charlie\']
scores = [85, 92, 78]
grades = [\'A\', \'A\', \'B\']
# 创建一个字典,每个学生对应一个包含成绩和等级的元组
student_data = dict(zip(enumerate(students), zip(scores, grades)))
print(student_data)
输出:
{(0, \'Alice\'): (85, \'A\'), (1, \'Bob\'): (92, \'A\'), (2, \'Charlie\'): (78, \'B\')}
解释: