2024-05-12 10:23:10 发布
网友
给出一个清单
l = [1, 7, 3, 5]
我想遍历所有连续列表项对(1,7), (7,3), (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模块应该有一个解决方案,但我就是想不出来。
itertools
看看pairwise的itertools食谱:http://docs.python.org/2/library/itertools.html#recipes
pairwise
引用:
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)
我将创建一个通用的grouper生成器,如下所示
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
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
>>> l = [1, 7, 3, 5] >>> for first, second in zip(l, l[1:]): ... print first, second ... 1 7 7 3 3 5
如前所述,对于不想创建新列表的很长的列表,可以考虑使用itertools中的izip函数。
izip
import itertools for first, second in itertools.izip(l, l[1:]): ...
看看
pairwise
的itertools食谱:http://docs.python.org/2/library/itertools.html#recipes引用:
一般版本
一般情况下,生成任意给定正自然大小的元组,可能如下所示:
我将创建一个通用的
grouper
生成器,如下所示样本运行1
输出
样本运行1
输出
只需使用zip
如前所述,对于不想创建新列表的很长的列表,可以考虑使用
itertools
中的izip
函数。相关问题 更多 >
编程相关推荐