Python enumerate 详解

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])

这样我们能拿到索引和元素的结果:

0 a
1 b
2 c

采用 enumerate 写法,代码如下:

for i,item in enumerate(lst):
    print(i,item)

可能这时会有疑问:用 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)

甚至更简洁,我们跳过读取所有内容这一步,直接用 enumerate:

for idx, line in enumerate(open('test.txt', 'r'),1):
    print(idx,line)

总结一下:之所以选用 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)

这样便能得到目标字典,当然也可以通过设置索引的起点值来改变。

{0: 'a', 1: 'b', 2: 'c'}
  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
zip()函数可以将两个或多个列表、元组或其他序列的元素逐个配对,构成一个由元组构成的列表。如果两个序列的元素个数不一样,那么zip()函数会以较短序列的长度为准进行配对。例如,如果list1=['a','b','c','d','e'],seq3=['one','two','three','four','five'],则使用zip()函数配对后的结果为:。 enumerate()函数则是用来枚举一个序列的元素,并返回带有索引的元组。通常情况下,我们会将enumerate()函数与zip()函数一起使用。例如,如果list1=['a','b','c','d','e'],seq3=['one','two','three','four','five'],则可以使用enumerate()和zip()函数来同时枚举两个序列的元素,代码如下: ``` list1 = ['a','b','c','d','e'] seq3 = ['one','two','three','four','five'] for i, (a, b) in enumerate(zip(list1, seq3)): print('{}:({},{})'.format(i, a, b)) ``` 这段代码会输出: ``` 0:(a,one) 1:(b,two) 2:(c,three) 3:(d,four) 4:(e,five) ``` 其,i表示元素在序列的索引,a和b分别表示两个序列配对的元素。通过enumerate()和zip()函数的结合使用,我们可以方便地同时遍历并操作多个序列的元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Python详解 enumerate + zip 函数](https://blog.csdn.net/qq_39478403/article/details/105839390)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Pythonenumerate()和zip()](https://blog.csdn.net/catofblack/article/details/124339134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值