2007-08-27

 

Python Cookbook 4.4 在序列中遍历它的元素和索引

需求:

你需要遍历一个序列,同时,你也要知道当前的元素的索引号.(你也许要改变它们的顺序),而Python使用的遍历方式不依赖于索引号.

讨论:

使用Python的enumerate可以解决这个问题,比如:
 for index, item in enumerate(sequence):
if item > 23:
sequence[index] = transform(item)
这比使用索引来访问序列更清晰,可读和快速:

for index in range(len(sequence)):
   if sequence[index] > 23:
      sequence[index] = transform(sequence[index])

遍历序列是很常见的需求,Python也加强了这方面的处理,你可以很方便的处理这样的需求.换句话说,最Python的使用方法是:

for item in sequence:
    process(item)

而不是和一些低级语言一样,需要按照元素的索引号来访问数据.

for index in range(len(sequence)):
    process(sequence[index])

直接遍历更清晰,简洁,快速和通用(你可以遍历任何序列,而使用索引只能遍历列表)
然而,有些情况下,你需要知道索引值,最常见的用法就是重新为序列元素绑定值.为了满足这个需求,Python提供了内建函数enumerate,这个函数可以接收任何可迭代对象为参数,并返回一个值对(index,item),可以使用下面的for循环来完成:

for index, item in enumerate(sequence):

这样能同时得到索引值和元素.
对于列表L,可以使用d=dict(enumerate),这样返回了一个和L等价的字典.其中d[i] is L[i]

相关说明:

class enumerate(object)
 |  enumerate(iterable) -> iterator for index, value of iterable
 |
 |  Return an enumerate object.  iterable must be an other object that supports
 |  iteration.  The enumerate object yields pairs containing a count (from
 |  zero) and a value yielded by the iterable argument.  enumerate is useful
 |  for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
 |
 |  Methods defined here:
 |
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 |  __iter__(...)
 |      x.__iter__() <==> iter(x)
 |
 |  next(...)
 |      x.next() -> the next value, or raise StopIteration


标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?