在Python中迭代列表(current,next)

我有时需要在Python中遍历一个列表,查看“current”元素和“next”元素。 到目前为止,我的代码如下所示:

for current, next in zip(the_list, the_list[1:]): # Do something 

这个工作,做我所期望的,但有一个更习惯或有效的方式来做同样的事情?

以下是itertools模块文档的相关示例:

 import itertools def pairwise(iterable): "s -> (s0,s1), (s1,s2), (s2, s3), ..." a, b = itertools.tee(iterable) next(b, None) return itertools.izip(a, b) 

这是如何工作的:

首先,创build两个并行迭代器abtee()调用),它们都指向原始迭代的第一个元素。 第二个迭代器b向前移动1( next(b, None) ))。 此时指向s0和b指向s1。 ab都可以独立地遍历原始迭代器 – izip函数接受两个迭代器,并使返回的元素对成对,同时推进两个迭代器。

一个警告: tee()函数产生两个迭代器,它们可以彼此独立地前进,但是这是有代价的。 如果其中一个迭代器比另一个迭代器进一步发展,那么tee()需要将消耗的元素保留在内存中,直到第二个迭代器也消耗它们为止(它不能“倒回”原始迭代器)。 这里没关系,因为一个迭代器只比另一个迭代器先行一步,但总的来说这样很容易使用大量的内存。

而且由于tee()可以接受一个n参数,所以也可以用于两个以上的并行迭代器:

 def threes(iterator): "s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..." a, b, c = itertools.tee(iterator, 3) next(b, None) next(c, None) next(c, None) return itertools.izip(a, b, c) 

由于the_list[1:]实际上创build了整个列表(不包括其第一个元素)的副本,并且zip()在调用时立即创build了一个元组列表,所以共创build了三个副本。 如果你的清单非常大,你可能更喜欢

 from itertools import izip, islice for current_item, next_item in izip(the_list, islice(the_list, 1, None)): print(current_item, next_item) 

它根本不复制列表。

滚自己的!

 def pairwise(iterable): it = iter(iterable) a = next(it, None) for b in it: yield (a, b) a = b 

迭代索引可以做同样的事情:

 #!/usr/bin/python the_list = [1, 2, 3, 4] for i in xrange(len(the_list) - 1): current_item, next_item = the_list[i], the_list[i + 1] print(current_item, next_item) 

输出:

 (1, 2) (2, 3) (3, 4) 

我只是把这个出来, 我很惊讶没有人想过枚举()。

 for (index, thing) in enumerate(the_list): if index < len(the_list): current, next_ = thing, the_list[index + 1] #do something 

从清单使用列表理解对

 the_list = [1, 2, 3, 4] pairs = [[the_list[i], the_list[i + 1]] for i in range(len(the_list) - 1)] for [current_item, next_item] in pairs: print(current_item, next_item) 

输出:

 (1, 2) (2, 3) (3, 4) 

基本解决scheme:

 def neighbors( list ): i = 0 while i + 1 < len( list ): yield ( list[ i ], list[ i + 1 ] ) i += 1 for ( x, y ) in neighbors( list ): print( x, y ) 
 code = '0016364ee0942aa7cc04a8189ef3' # Getting the current and next item print [code[idx]+code[idx+1] for idx in range(len(code)-1)] # Getting the pair print [code[idx*2]+code[idx*2+1] for idx in range(len(code)/2)]