杰瑞科技汇

Python遍历字典时,enumerate能同时获取键和索引吗?

enumerate 函数最常用于遍历列表或元组,因为它能同时提供元素的索引和值,对于字典来说,情况稍微有些不同,因为字典的核心是键值对。

Python遍历字典时,enumerate能同时获取键和索引吗?-图1
(图片来源网络,侵删)

核心概念

enumerate() 函数是一个 Python 内置函数,它接受一个可迭代对象(如列表、元组、字符串、字典等)作为参数,并返回一个迭代器,这个迭代器会生成包含索引和值的元组。

对于字典,当直接使用 enumerate(dict) 时,它会遍历字典的

my_dict = {'a': 1, 'b': 2, 'c': 3}
# 直接遍历字典,enumerate 会提供键和索引
for index, key in enumerate(my_dict):
    print(f"索引: {index}, 键: {key}")
# 输出:
# 索引: 0, 键: a
# 索引: 1, 键: b
# 索引: 2, 键: c

在实际开发中,我们通常更关心的是 ,我们需要结合 dictionary.items() 方法来达到目的。


主要用法:enumerate(dict.items())

这是使用 enumerate 处理字典最常用、最强大的方式。dict.items() 方法会返回一个包含字典所有键值对的视图对象,每个键值对是一个 (key, value) 元组。enumerate 会为这些 (key, value) 元组加上索引。

Python遍历字典时,enumerate能同时获取键和索引吗?-图2
(图片来源网络,侵删)

示例 1:获取索引、键和值

这是最常见的需求,同时获取键、值以及它们在迭代中的顺序索引。

scores = {
    'Alice': 95,
    'Bob': 88,
    'Charlie': 76,
    'David': 99
}
print("使用 enumerate 遍历字典的键和值:")
for index, (name, score) in enumerate(scores.items()):
    print(f"排名 {index + 1}: {name} 的分数是 {score}")
# 输出:
# 使用 enumerate 遍历字典的键和值:
# 排名 1: Alice 的分数是 95
# 排名 2: Bob 的分数是 88
# 排名 3: Charlie 的分数是 76
# 排名 4: David 的分数是 99

代码解析:

  1. scores.items() 返回 [('Alice', 95), ('Bob', 88), ('Charlie', 76), ('David', 99)] 这样的视图。
  2. enumerate(scores.items()) 返回 [(0, ('Alice', 95)), (1, ('Bob', 88)), ...] 这样的迭代器。
  3. for 循环中,我们使用 index, (name, score) 进行 元组解包
    • index 接收元组的第一个元素(索引)。
    • (name, score) 接收元组的第二个元素,它本身是一个 (key, value) 元组,所以我们再次解包它,分别赋值给 namescore

enumerate 的可选参数 start

enumerate 函数有一个可选参数 start,用于指定索引的起始值,默认为 0

示例 2:从 1 开始排名

上面的例子中,我们通过 index + 1 来实现从 1 开始排名,更优雅的方式是直接使用 start 参数。

Python遍历字典时,enumerate能同时获取键和索引吗?-图3
(图片来源网络,侵删)
scores = {
    'Alice': 95,
    'Bob': 88,
    'Charlie': 76,
    'David': 99
}
print("使用 start=1 从 1 开始排名:")
for index, (name, score) in enumerate(scores.items(), start=1):
    print(f"排名 {index}: {name} 的分数是 {score}")
# 输出:
# 使用 start=1 从 1 开始排名:
# 排名 1: Alice 的分数是 95
# 排名 2: Bob 的分数是 88
# 排名 3: Charlie 的分数是 76
# 排名 4: David 的分数是 99

这个方法更清晰、更直接,是处理排名、序号等场景的最佳实践。


其他用法:只遍历键或只遍历值

虽然不常用,但了解 enumeratedict.keys()dict.values() 的交互也是有帮助的。

示例 3:只遍历键(并获取索引)

my_dict = {'a': 1, 'b': 2, 'c': 3}
print("只遍历键(带索引):")
for index, key in enumerate(my_dict.keys()):
    print(f"索引: {index}, 键: {key}")
# 输出:
# 只遍历键(带索引):
# 索引: 0, 键: a
# 索引: 1, 键: b
# 索引: 2, 键: c

注意:for key in my_dictfor key in my_dict.keys() 的效果是相同的,后者更明确一些。

示例 4:只遍历值(并获取索引)

my_dict = {'a': 1, 'b': 2, 'c': 3}
print("只遍历值(带索引):")
for index, value in enumerate(my_dict.values()):
    print(f"索引: {index}, 值: {value}")
# 输出:
# 只遍历值(带索引):
# 索引: 0, 值: 1
# 索引: 1, 值: 2
# 索引: 2, 值: 3

总结与最佳实践

遍历方式 代码示例 应用场景
遍历键 for key in my_dict: 最常用,当你只需要键时。
遍历键和值 for key, value in my_dict.items(): 最常用,当你需要同时处理键和值时。
遍历键和值(带索引) for index, (key, value) in enumerate(my_dict.items()): 最佳实践,当你需要知道元素在迭代中的顺序(如排名、序号、生成报告)时。
遍历键和值(从1开始索引) for index, (key, value) in enumerate(my_dict.items(), start=1): 最佳实践,当你需要从1开始计数时(如排名、列表序号)。

核心要点:

  1. enumerate(dict) 会遍历字典的
  2. 要同时获取 索引、键、值,必须使用 enumerate(dict.items())
  3. 使用元组解包 index, (key, value) 来清晰地将 enumerate 返回的结构赋值给变量。
  4. 利用 start 参数可以轻松改变索引的起始值,使代码更具可读性。
分享:
扫描分享到社交APP
上一篇
下一篇