在相当长的一段时间里,我使用了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)))

关于python - 从itertools配方中逐对给出的结果是否总是与zip(a,a [1:])相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32337891/

10-15 08:14