簡體   English   中英

從itertools配方中逐對給出的結果是否總是與zip(a,a [1:])相同?

[英]Is pairwise from itertools recipes always giving the same results as zip(a, a[1:])?

在相當長的一段時間里,我使用了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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM