返回介绍

建议15:使用 enumerate() 获取序列迭代的索引和值

发布于 2024-01-30 22:19:09 字数 2251 浏览 0 评论 0 收藏 0

基本上所有的项目中都存在对序列进行迭代并获取序列中的元素进行处理的场景。这是一个非常普通而且简单的需求,相信很多人一口气能写出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

程序输出如下:

index: 4 element: e
index: 3 element: d
index: 2 element: c
index: 1 element: b
index: 0 element: a

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

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

要获取迭代过程中字典的key和value,应该使用如下iteritems()方法:

for k,v in  personinfo.iteritems():
  print k,":",v

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文