使用enumerate()获取序列迭代的索引和值,基本上所有的项目中都存在对序列进行迭代并获取序列中的元素进行处理的场景。这是一个非常普通而且简单的需求,相信很多人一口气能写出N种实现方法。举例如下。
方法一 在每次循环中对索引变量进行自增。
li = ['a', 'b', 'c', 'd', 'e']
index=0
for i in li:
print "index:",index,"element:",i
index+=1
方法二 使用range()和len()方法结合。
li = ['a', 'b', 'c', 'd', 'e']
for i in range(len(li)):
print "index:",i,"element:",li[i]
方法三 使用while循环,用len()获取循环次数。
li = ['a', 'b', 'c', 'd', 'e']
index=0
while index < len(li):
print "index:",index,"element:",li[index]
index+=1
方法四 使用zip()方法。
li = ['a', 'b', 'c', 'd', 'e']
for i, e in zip(range(len(li)), li):
print "index:",i,"element:",e
方法五 使用enumerate()获取序列迭代的索引和值。
li = ['a', 'b', 'c', 'd', 'e']
for i,e in enumerate(li):
print "index:",i,"element:",e
这里推荐的是使用方法五,因为它代码清晰简洁,可读性最好。函数enumerate()
是在Python2.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 0x00373E18>
>>> e = enumerate(li)
>>> e.next()
(0, 'a')
>>> e.next()
(1, 'b')
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
程序输出如下:
需要提醒的是,对于字典的迭代循环,enumerate()函数并不适合,虽然在使用上并不会提示错误,但输出的结果与期望的大相径庭,这是因为字典默认被转换成了序列进行处理。
personinfo = {'name': 'Jon', 'age': '20','hobby':'football'}
for k, v in enumerate(personinfo):
print k,v
输出为:
要获取迭代过程中字典的key和value,应该使用如下iteritems()
方法:
personinfo = {'name': 'Jon', 'age': '20','hobby':'football'}
for k,v in personinfo.iteritems():
print k,":",v
输出为:
酷客网相关文章:
评论前必须登录!
注册