>>> from env_helper import info; info()
页面更新时间: 2024-01-20 22:06:50
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-17-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

2.7. 使用 enumerate() 获取序列迭代的索引和值

基本所有的项目中都存在对序列进行迭代并获取序列中的元索进行处理的场景。 这是一个非常普通而且简单的需求,相信很多人一口气能写出N种实现方法。举例如下。

2.7.1. 方法一 在每次循环中对索引变量进行自增

>>> li = ['a', 'b', 'c ','d', 'e']
>>> index=0
>>> for i in li:
>>>     print ("index:",index,"element:",i)
>>>     index+=1
index: 0 element: a
index: 1 element: b
index: 2 element: c
index: 3 element: d
index: 4 element: e

2.7.2. 方法二 使用range()和len()方法结合

>>> li = ['a', 'b', 'c ','d', 'e']
>>> for i in range(len(li)):
>>>     print ("index: ",i,"element:",li [i])
index:  0 element: a
index:  1 element: b
index:  2 element: c
index:  3 element: d
index:  4 element: e

2.7.3. 方法三 使用while循环,用 len() 获取循环次数

>>> li = ['a', 'b', 'c ','d', 'e']
>>> index=0
>>> while index < len(li) :
>>>     print ("index:", index, "element:",li[index] )
>>>     index+=1
index: 0 element: a
index: 1 element: b
index: 2 element: c
index: 3 element: d
index: 4 element: e

2.7.4. 方法四 使用zip()方法

>>> li = ['a', 'b', 'c ','d', 'e']
>>> for i, e in zip(range (len (li)) , li):
>>>                  print( "index: ",i, "element:",e)
index:  0 element: a
index:  1 element: b
index:  2 element: c
index:  3 element: d
index:  4 element: e

2.7.5. 方法五 使用enumerate()获取序列迭代的索引和值

>>> li = ['a', 'b', 'c ','d', 'e']
>>> for i, e in enumerate (li):
>>>     print ("index:",i,"element:",e)
index: 0 element: a
index: 1 element: b
index: 2 element: c
index: 3 element: d
index: 4 element: e

这里推荐的是使用方法五,因为它代码清晰简洁,可读性最好。函数 enumerate() 是在 Python 2.3 中引入的,主要是为了解决在循环中获取索引以及对应值的问题。 它具有一定的惰性(lazy),每次仅在需要的时候才会产生一个 (index,item)

对其函数签名如下:

enumerate (sequence, start=0)

其中,sequence可以为序列,如list 、 set等。 也可以为一个iterato或者任何可以迭代的对象,默认的start为0 , 函数数返回本质上为一个迭代器,可以使用 next() 方法获取下一个迭代元素,如下所示:

>>> li = ['a', 'b', 'c ','d', 'e']
>>> print (enumerate(li))
<enumerate object at 0x7f1b3c0880e0>

enumerate()函数的内部实现非常简单,enumerate(sequence,start=0)实际相当于如下代码:

>>> def enumerate(sequence, start=0):
>>>     n = start
>>>     for elem in sequence:
>>>         yield n,elem
>>>         n += 1

因此利用这个特性用户还可以实现自己的enumerate()函数。比如,myenumerate()以反 序的方式获取序列的索引和值。

>>> def myenumerate(sequence):
>>>     n = -1
>>>     for elem in reversed(sequence):
>>>         yield len(sequence)+n, elem
>>>         n =n-1
>>> li = ['a', 'b', 'c ','d', 'e']
>>> for i,e in myenumerate(li):
>>>     print ("index: ", i, "element:", e)
index:  4 element: e
index:  3 element: d
index:  2 element: c
index:  1 element: b
index:  0 element: a

需要提醒的是,对于字典的迭代循环,emumerate()函数并不适合,虽然在使用上并不会提示错误,但输出的结果与期望的大相径庭,这是因为字典默认被转换成了序列进行处理。

>>> personinfo = {'name ' : ' Jon', 'age' :'20', 'hobby' : ' football' }
>>> for k, v in enumerate(personinfo):
>>>     print (k,v)
0 name
1 age
2 hobby

要获取迭代过程中字典的key和value,应该使用如下iteritems()方法。但应该使用如下iteritems在python3报错,将iteritems改为items即可。iteritems是为python2环境中dict的函数:

>>> for k, v in personinfo.items():
>>>     print (k,":",v)
name  :  Jon
age : 20
hobby :  football