Python中enumerate()函数同时遍历索引与值的用法详解
本文详解Python内置enumerate()函数,用于在迭代序列时同步获取元素索引与值。通过设置start参数调整起始行号,结合文件处理实现错误定位与单词行号映射统计。文章对比了手动计数与enumerate的写法差异,并指出解包元组时的常见陷阱,帮助开发者写出更简洁高效的Python代码。
在迭代一个序列的过程中,如果需要同时跟踪当前被处理元素的索引位置,该如何操作?
获取索引的方法
Python内置的enumerate()函数是解决这一需求的最佳方案:
>>> my_list = ['a', 'b', 'c'] >>> for idx, val in enumerate(my_list): ... print(idx, val) ... 0 a 1 b 2 c
默认行号从0开始,若需从1开始计数
若希望输出符合传统行号习惯(即从1开始),可以在调用enumerate()时传入start参数:
>>> my_list = ['a', 'b', 'c'] >>> for idx, val in enumerate(my_list, 1): ... print(idx, val) ... 1 a 2 b 3 c
利用行号进行定位
当遍历文件并在报错信息中需要指明具体行号时,这种定位方式非常实用:
def parse_data(filename):
with open(filename, 'rt') as f:
for lineno, line in enumerate(f, 1):
fields = line.split()
try:
count = int(fields[1])
...
except ValueError as e:
print('Line {}: Parse error: {}'.format(lineno, e))
enumerate()在追踪列表中特定值出现的位置时十分高效。例如,若需将文件中出现的单词映射到其所在的行号,利用enumerate()可以轻松实现:
word_summary = defaultdict(list)
with open('myfile.txt', 'r') as f:
lines = f.readlines()
for idx, line in enumerate(lines):
# Create a list of words in current line
words = [w.strip().lower() for w in line.split()]
for word in words:
word_summary[word].append(idx)
处理完文件并打印word_summary后,你会发现它是一个字典(确切地说是defaultdict类型)。该字典中每个单词作为键,对应的值是一个包含该单词所有出现行号的列表。若某单词在同一行出现多次,其行号会在列表中重复出现,这也可作为简单的文本统计依据。
引入计数变量的场景
当需要额外定义一个计数变量时,使用enumerate()能使代码更简洁。常见的错误写法如下:
lineno = 1 for line in f: # Process line ... lineno += 1
相比之下,使用enumerate()函数替代手动计数显得更为优雅:
for lineno, line in enumerate(f): # Process line ...
enumerate()函数返回的是一个enumerate对象实例,它属于迭代器类型。该迭代器会连续返回包含计数器和值的元组,这些值是通过在传入的序列上调用next()方法获取的。
常见陷阱
此外,还有一个虽不关键但值得注意的细节:当在已解包的元组序列上直接使用enumerate()时,容易陷入语法陷阱。正确的写法应如下所示:
data = [ (1, 2), (3, 4), (5, 6), (7, 8) ] # Correct! for n, (x, y) in enumerate(data): ... # Error! for n, x, y in enumerate(data): ...
官方文档参考:
https://docs.python.org/2/library/functions.html#enumerate
以上关于Python同时遍历数组索引与值的实例分享完毕,希望能对读者有所帮助,欢迎支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













