迭代给定列表中的所有连续项目对

给出一个列表

l = [1,7,3,5] 

我想迭代所有的连续列表项目对(1,7),(7,3),(3,5) ,即

 for i in xrange(len(l)-1): x=l[i] y=l[i+1] # do something 

我想以更紧凑的方式做到这一点,比如for (x,y) in someiterator(l): ...有没有办法使用一些内置的python迭代器来做到这一点? 我相信itertools模块应该有一个解决scheme,但我无法弄清楚…

只需使用zip

 >>> l = [1, 7, 3, 5] >>> for first, second in zip(l, l[1:]): ... print first, second ... 1 7 7 3 3 5 

build议您可以考虑在itertools使用izip函数来处理非常长的列表,您不想创build新列表。

 import itertools for first, second in itertools.izip(l, l[1:]): ... 

在itertools食谱看pairwise: http : //docs.python.org/2/library/itertools.html#recipes

从那里引用:

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

一般版本

产生任何给定的正自然尺寸的元组的一般版本可能看起来像这样:

 def nwise(iterable, n=2): iters = tee(iterable, n) for i, it in enumerate(iters): next(islice(it, i, i), None) return izip(*iters) 

我会创build一个通用的grouper生成器,就像这样

 def grouper(input_list, n = 2): for i in xrange(len(input_list) - (n - 1)): yield input_list[i:i+n] 

样品运行1

 for first, second in grouper([1, 7, 3, 5, 6, 8], 2): print first, second 

产量

 1 7 7 3 3 5 5 6 6 8 

样品运行1

 for first, second, third in grouper([1, 7, 3, 5, 6, 8], 3): print first, second, third 

产量

 1 7 3 7 3 5 3 5 6 5 6 8 

你可以使用zip

 >>> list(zip(range(5), range(2, 6))) [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

就像一个拉链,它创造了一对。 所以,要混合你的两个列表,你会得到:

 >>> l = [1,7,3,5] >>> list(zip(l[:-1], l[1:])) [(1, 7), (7, 3), (3, 5)] 

然后迭代就像

 for x, y in zip(l[:-1], l[1:]): pass 

下面的内容非常简单/可读,完成这项工作,也可能是最有效的。

将列表转换为生成器(或者更好地从一个迭代器开始,以星号开头):

 gen = (x for x in l) 

将它转换成对:

 [(x, gen.next()) for x in gen] 

这就是你所需要的。

当然,最好还是把它制作成一个发生器,并根据需要读取它:

 ( (x, gen.next()) for x in gen)