反转`pairwise`发生器

时间:2013-10-24 10:56:23

标签: python generator itertools

我有一个类似于itertools'pairwise配方的生成器,它产生(s0,s1), (s1,s2), (s2, s3)...。我想从它创建另一个生成器,它将产生原始序列s0, s1, s2, s3,...

from itertools import *

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

a = [1,2,3,4]

for item in unpair(pairwise(a)):
   print item # should print 1,2,3,4

如何将unpair作为生成器编写,而不依赖于列表?

5 个答案:

答案 0 :(得分:5)

也许:

def unpair(iterable):
    p = iter(iterable)
    return chain(next(p, []), (x[1] for x in p))

答案 1 :(得分:3)

应该是这样:

def unpairwise(iterable):
    for i, (fst, snd) in enumerate(iterable):
        if i == 0:
            yield fst
        yield snd

如果您担心在每个循环中被评估的if,您当然可以这样做:

def unpairwise(iterable):
    fst, snd = iterable.next()
    yield fst
    yield snd
    for fst, snd in iterable:
        yield snd

答案 2 :(得分:2)

你可以试试这个:

def unpair(iterable):
    it = iter(iterable)
    head = next(it)
    yield head[0]
    yield head[1]
    for fst, snd in it:
        yield snd

答案 3 :(得分:1)

>>> from itertools import chain
>>> def unpair(iterable):
...     x, y = zip(*iterable)
...     return chain([x[0]], y)

答案 4 :(得分:1)

一个简洁的DSM版本,但适用于空列表:

from itertools import islice, chain
def unpair(iterable):
    p = iter(iterable)
    return chain(chain(*islice(p,1)),(x[1] for x in p))