我有一个类似于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
作为生成器编写,而不依赖于列表?
答案 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))