迭代给定列表中的所有连续项目对
给出一个列表
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)