杰瑞科技汇

Python中enumerate怎么用?

这是一个非常常用且强大的内置函数,它的主要作用是在遍历可迭代对象(如列表、元组、字符串等)时,同时获取元素的索引

Python中enumerate怎么用?-图1
(图片来源网络,侵删)

enumerate 是什么?

enumerate 就像一个“编号器”,当你遍历一个列表时,它不仅能给你列表里的每一个元素,还能告诉你这个元素是第几个(从0开始计数)。

官方定义enumerate(iterable, start=0) 返回一个枚举对象,该对象生成由 count(从 start 开始)和来自 iterable 的值组成的元组。

核心输出:一个迭代器,每次迭代都会产生一个 (index, value) 形式的元组。


为什么需要 enumerate?(解决了什么问题)

在没有 enumerate 之前,如果我们想在循环中同时得到索引和值,通常需要这样做:

Python中enumerate怎么用?-图2
(图片来源网络,侵删)
# 传统方法:使用 range(len())
fruits = ['apple', 'banana', 'cherry']
for i in range(len(fruits)):
    fruit = fruits[i]
    print(f"索引: {i}, 值: {fruit}")

输出:

索引: 0, 值: apple
索引: 1, 值: banana
索引: 2, 值: cherry

这种方法虽然可行,但代码略显笨拙:

  1. len(fruits) 是多余的,我们其实不需要先计算长度。
  2. 通过 fruits[i] 来访问元素,多了一步索引查找,不够直接和“Pythonic”。

使用 enumerate 可以让代码更简洁、更易读、更符合 Python 的风格。


enumerate 的基本用法

语法

enumerate(iterable, start=0)

Python中enumerate怎么用?-图3
(图片来源网络,侵删)
  • iterable: 任何可迭代对象(列表、元组、字符串、字典等)。
  • start: 可选参数,指定索引的起始值,默认为 0

示例 1:遍历列表(默认从 0 开始)

fruits = ['apple', 'banana', 'cherry']
# 直接遍历 enumerate 对象
for index, value in enumerate(fruits):
    print(f"索引: {index}, 值: {value}")

输出:

索引: 0, 值: apple
索引: 1, 值: banana
索引: 2, 值: cherry

代码解析

  • enumerate(fruits) 创建了一个枚举对象。
  • for 循环中,我们使用 for index, value in ... 的形式进行元组解包,每次迭代,enumerate 返回的 (0, 'apple') 这样的元组会自动解包成 index = 0value = 'apple'

示例 2:指定起始索引

假设我们想让索引从 1 开始计数(就像列表的第1项、第2项...)。

fruits = ['apple', 'banana', 'cherry']
for index, value in enumerate(fruits, start=1):
    print(f"序号: {index}, 值: {value}")

输出:

序号: 1, 值: apple
序号: 2, 值: banana
序号: 3, 值: cherry

代码解析

  • 我们只需要在 enumerate 中传入 start=1 即可,非常方便。

enumerate 的高级用法

示例 3:与其他可迭代对象一起使用

enumerate 不仅限于列表,它可以用于任何可迭代对象。

用于元组

# 计算字符串中每个字符的ASCII码
text = "hello"
for index, char in enumerate(text):
    print(f"字符 '{char}' 的ASCII码是 {ord(char)}")

用于字符串

# 遍历元组
coordinates = (10.0, 20.0, 30.0)
for i, coord in enumerate(coordinates):
    print(f"坐标 {i+1}: {coord}")

示例 4:直接转换为列表或字典

你可以将 enumerate 的结果直接转换为其他数据结构,这在数据处理中非常有用。

转换为列表

fruits = ['apple', 'banana', 'cherry']
list_of_tuples = list(enumerate(fruits))
print(list_of_tuples)

输出:

[(0, 'apple'), (1, 'banana'), (2, 'cherry')]

转换为字典(一个经典技巧): 假设有两个列表,一个作为键,一个作为值,我们可以用 enumeratezip 来快速创建字典。

keys = ['name', 'age', 'city']
values = ['Alice', 30, 'New York']
# 使用 zip 和 enumerate
# zip(keys, values) 会生成 [('name', 'Alice'), ('age', 30), ('city', 'New York')]
# 然后我们只需要值,所以用解包忽略索引
my_dict = {key: value for key, value in zip(keys, values)}
print(my_dict)
# 更直接的方式(如果索引不重要)
my_dict_v2 = dict(zip(keys, values))
print(my_dict_v2)

输出:

{'name': 'Alice', 'age': 30, 'city': 'New York'}
{'name': 'Alice', 'age': 30, 'city': 'New York'}

(注:虽然这里没有直接使用 enumerate,但展示了 enumerate 所在的“迭代器工具”生态,如果需要一个带索引的字典,可以这样:)

keys = ['name', 'age', 'city']
my_dict_with_index = {index: key for index, key in enumerate(keys)}
print(my_dict_with_index)

输出:

{0: 'name', 1: 'age', 2: 'city'}

示例 5:在列表推导式中使用

你可以在列表推导式中使用 enumerate 来创建基于索引的新列表。

words = ['hello', 'world', 'python']
# 创建一个新列表,包含每个单词的长度和其索引
word_info = [(i, len(word)) for i, word in enumerate(words)]
print(word_info)

输出:

[(0, 5), (1, 5), (2, 6)]

enumerate vs. zip

enumeratezip 是两个经常被放在一起讨论的函数,因为它们都用于处理多个序列。

特性 enumerate(iterable) zip(iterable1, iterable2, ...)
目的 一个可迭代对象的元素添加索引。 多个可迭代对象的元素按索引配对。
输入 1 个可迭代对象。 2 个或多个可迭代对象。
输出 (index, element_from_iterable1) (element_from_iterable1, element_from_iterable2, ...)
类比 给一排人编号(编号, 姓名)。 把两个班级的第一名放一起,第二名放一起...(班级1_学生, 班级2_学生)。

zip 示例

names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
# 将名字和分数配对
for name, score in zip(names, scores):
    print(f"{name} 的分数是 {score}")

输出:

Alice 的分数是 85
Bob 的分数是 92
Charlie 的分数是 78

enumerate 是 Python 中一个不可或缺的工具函数,当你需要在循环中同时获取元素的索引和值时,它应该成为你的首选。

核心优势

  1. 代码简洁:避免了 range(len(...)) 的冗余写法。
  2. 可读性强for index, value in enumerate(...) 的意图非常清晰。
  3. 功能灵活:可以通过 start 参数轻松控制索引的起始值。

记住它,并在你的日常编码中多使用它,你的代码会变得更“Pythonic”!

分享:
扫描分享到社交APP
上一篇
下一篇