python enumerate()函数

时间:2020-02-23 14:42:40  来源:igfitidea点击:

在本Python教程中,我们将重点介绍Python的enumerate()函数及其一些简单而实际的示例。

Python enumerate()函数语法

有时候,当我们在for循环中遍历一个容器时,我们想要访问正在处理的当前项目的索引(列表中的当前位置)。
一种解决方法是:

i = 0
for value in collection:
   # do something with value
   i += 1

由于这很常见,因此Python具有内置函数enumerate(),该函数返回序列(i,value)元组,其中每个元组的第一个对象是索引,第二个是原始对象物品。

for i, value in enumerate(collection):
   # do something with value

pythonenumerate()函数的一般语法:

enumerate(iterable, start=0)

其中

  • iterable-必须是序列,迭代器或者其他支持迭代的对象

  • start(可选)-enumerate()从该数字开始计数,如果未提供,则默认为0。

示例1:了解python enumerate()的工作方式

让我们以包含列表的这个简单示例脚本为例。
我将遍历列表的各个项目,然后将索引位置编号添加到每个值之前。
通常我会写这样的代码:

该脚本的输出:

~]# python3 python-enumerate.py
0: ab
1: cd
2: ef

现在感谢pythonenumerate()函数,我们可以用更多Python方式重新编写相同的代码:

#!/usr/bin/env python3
mylist = ['ab', 'cd', 'ef'] ## List
for i, val in enumerate(mylist):
    print(f'{i}: {val}')

该脚本的输出:

~]# python3 python-enumerate.py
0: ab
1: cd
2: ef

因此,两种方法的输出都是相同的,但是在复杂的场景中," enumerate()"可以为我们节省很多代码。

示例2:在文件中开始行之前添加行号

在此python代码中,我将打开一个文件以读取并在每行之前添加行号,并输出输出。
我没有修改文件的内容。

#!/usr/bin/env python3
import sys
## take the file as input argument
filename = sys.argv[1]
with open(filename) as myfile:
    for index, line in enumerate(myfile): 
        print(f"{index}: {line}", end="")

enumerate()函数返回一个元组序列,我们的for循环将每个元组分成两个值,并且print语句将它们格式化在一起。

如我们所见,计数器值已添加到每一行。
由于默认情况下counter是从0开始,所以行数也是从0开始。
如果我们希望从1开始计数,那么我们必须使用index + 1对代码进行一些小的修改。
因为枚举(像所有序列一样)都是从零开始的,所以它为每个行号的索引加1.

#!/usr/bin/env python3
import sys
## take the file as input argument
filename = sys.argv[1]
with open(filename) as myfile:
    for index, line in enumerate(myfile): 
        ## using index+1 to start the count from 1
        print(f"{index+1}: {line}", end="")

因此,现在索引值按预期从1开始。

示例3:使用enumerate()创建字典

在为数据建立索引时,使用枚举的有用模式是计算将序列值(假定为唯一)映射到序列中其位置的dict:

#!/usr/bin/env python3
mycars = ['maruti', 'hyundai', 'honda']
mapping = {} ## empty dictionary
for index, value in enumerate(mycars):
    mapping[value] = index
print(mapping) ## content of mapping
print(type(mapping)) ## type of mapping

该脚本的输出:

~]# python3 python-enumerate-2.py
{'maruti': 0, 'hyundai': 1, 'honda': 2}
<class 'dict'>

示例4:将索引和值打印为元组

我们一直在通过分隔索引和值来修改输出,但是如果我们只是在enumerate()上进行迭代,则会得到一个元组,因此不需要修改,只需一个简单的for循环就可以完成工作。

#!/usr/bin/env python3
mylist = ['ab', 'cd', 'ef'] ## List
for val in enumerate(mylist):
    print(val)
    print(type(val))

该脚本的输出:

~]# python3 python-enumerate-3.py
(0, 'ab')
<class 'tuple'>
(1, 'cd')
<class 'tuple'>
(2, 'ef')
<class 'tuple'>

我们还可以采用列表格式获取输出:

#!/usr/bin/env python3
mylist = ['ab', 'cd', 'ef'] ## List
mynewlist = list(enumerate(mylist))
print(mynewlist)
print(type(mynewlist))

该脚本的输出:

~]# python3 python-enumerate-3.py
[(0, 'ab'), (1, 'cd'), (2, 'ef')]
<class 'list'>

示例5:定义起始编号以开始计数

默认情况下,我们已经看到单个项目的计数以" 0"开始,但是我们可以使用" start = <num>"定义自己的起点,其中我们可以将" num"替换为任何整数值。
在上面使用的同一示例中,我们将定义一个不同的起始编号:

#!/usr/bin/env python3
mylist = ['ab', 'cd', 'ef'] ## List
mynewlist = list(enumerate(mylist, start=100))
print(mynewlist)
print(type(mynewlist))

该脚本的输出:

~]# python3 python-enumerate-3.py
[(100, 'ab'), (101, 'cd'), (102, 'ef')]
<class 'list'>

因此,现在我们的输出包含一个列表,其中第一个项目的计数从100开始,列表中每个项目的计数都由1添加