在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两个并行迭代器a
和b
( tee()
调用),它们都指向原始迭代的第一个元素。 第二个迭代器b
向前移动1( next(b, None)
))。 此时指向s0和b
指向s1。 a
和b
都可以独立地遍历原始迭代器 – 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)]