enumerate 是什么
- 首先单词 enumerate 美式音标 [ɪˈnuːməreɪt], vt. 列举;枚举;计算
- enumerate() 是 python 内置函数,可以直接使用,
- enumerate() 的作用就是按 序号(索引序列)+元素(值) 的形式将一个可迭代对象返回
- 例如有个列表 [ “a”,“b”,“c”], 通过 enumerate() 可以直接获取到 (0,“a”)、(1,“b”)、(2,“c”) 序号搭配元素
为什么要用 enumerate
通常初学 Python 时,为了拿到列表中的索引和元素,要这么写:
lst = ["a","b","c"]
for i in range(len(lst)):
print(i,lst[i])
- 1
- 2
- 3
这样我们能拿到索引和元素的结果:
0 a
1 b
2 c
- 1
- 2
- 3
采用 enumerate 写法,代码如下:
for i,item in enumerate(lst):
print(i,item)
- 1
- 2
可能这时会有疑问:用 range 的写法看着不比 enumerate 复杂啊?而且 enumerate 这个词还挺难记的…
这二者看着代码都比较简单,但实现方式不同:前者通过 range 来获取索引,根据索引再取到列表中的元素;后者则是通过 enumerate() 内置函数来将列表包装成生成器,直接取到其索引和值。
此外,enumerate(lst,1) 还可以添加个索引值起点参数,若设成 1,则索引从 1 开始,这个设置在比如我们想打印某文档第几行什么内容时非常实用:
with open('test.txt', 'r') as f:
lines = f.readlines()
for idx, line in enumerate(lines,1):
print(idx,line)
- 1
- 2
- 3
- 4
- 5
甚至更简洁,我们跳过读取所有内容这一步,直接用 enumerate:
for idx, line in enumerate(open('test.txt', 'r'),1):
print(idx,line)
- 1
- 2
总结一下:之所以选用 enumerate(),是因为这个 enumerate() 就是被设计用来解决获取值的同时也获取索引值这个问题的,相比于其它间接方法,该用法更直接也更简洁。
拓展
1 书籍建议
《Effective Python 编写高质量 Python 代码的 59 个有效方法》一书中第 10 条:尽量用 enumerate 取代 range:
要点:
- enumerate 函数提供了一种精简写法,可以在便利迭代器时获知每个元素的索引。
- 尽量用 enumerate 来改写那种将 range 与下标访问相结合的序列遍历代码。
- 可以给 enumerate 提供第二个参数,以制定开始计数时所用的值(默认为0)。
2 enumerate 搭配字典
比如想将列表[“a”,“b”,“c”] 转化为字典 {0:“a”,1:“b”,3:“c”} 索引+值的形式,可以通过如下代码实现:
lst = ["a","b","c"]
dic = {}
for i,item in enumerate(lst):
dic[i]=item
print(dic)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
这样便能得到目标字典,当然也可以通过设置索引的起点值来改变。
{0: 'a', 1: 'b', 2: 'c'}
- 1