4

我有一个类似于 itertoolspairwise配方的生成器,它产生(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不求助于列表的情况下编写生成器?

4

5 回答 5

5

也许:

def unpair(iterable):
    p = iter(iterable)
    return chain(next(p, []), (x[1] for x in p))
于 2013-10-24T11:14:32.793 回答
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
于 2013-10-24T11:06:13.307 回答
2

你可以试试这个:

def unpair(iterable):
    it = iter(iterable)
    head = next(it)
    yield head[0]
    yield head[1]
    for fst, snd in it:
        yield snd
于 2013-10-24T11:21:17.770 回答
1
>>> from itertools import chain
>>> def unpair(iterable):
...     x, y = zip(*iterable)
...     return chain([x[0]], y)
于 2013-10-24T11:19:27.233 回答
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))
于 2013-10-24T13:51:11.417 回答