Skip to main content
 首页 » 编程设计

python之来自 itertools 食谱的成对总是给出与 zip(a, a[1 :])

2025年05月04日14cmt

很长一段时间我都使用 itertools 食谱中的成对函数。 ( https://docs.python.org/3.4/library/itertools.html#itertools-recipes )

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

但这不是总是给出与 zip(iterable, iterable[1:]) 相同的结果吗?

请您参考如下方法:

zip(iterable, iterable[1:]) 只适用于可以切片的东西。 pairwise 适用于任意可迭代对象。

为了演示,这是斐波那契数列的典型函数式无限列表(此处为生成器)的极其复杂的版本:

from itertools import tee 
 
 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return zip(a, b) 
 
 
def cons(x, xs): 
    yield x 
    yield from xs 
 
 
def take(count, l): 
    it = iter(l) 
 
    for i in range(count): 
        yield next(it) 
 
 
def lazy_yield_from(get_iterable): 
    yield from get_iterable() 
 
 
infinite_fibonacci, _if = tee( 
    cons(1, cons(1, lazy_yield_from(lambda: (a + b for a, b in pairwise(_if)))))) 
 
print(list(take(5, infinite_fibonacci)))