import itertools
with open(fn) as f:
for line, line2 in itertools.izip_longest(f, f, fillvalue=''):
print line, line2
唉,izip_longest 需要 Python 2.6 或更高版本; 2.5 只有izip,如果f 有奇数行,它会截断最后一行。当然,提供与生成器相同的功能非常容易。
这是一个更通用的“一次 N 个”迭代器包装器:
def natatime(itr, fillvalue=None, n=2):
return itertools.izip_longest(*(iter(itr),)*n, fillvalue=fillvalue)
itertools 通常是最好的方法,但是,如果你坚持自己实现,那么:
def natatime_no_itertools(itr, fillvalue=None, n=2):
x = iter(itr)
for item in x:
yield (item,) + tuple(next(x, fillvalue) for _ in xrange(n-1))
在 2.5 中,我认为最好的方法其实不是生成器,而是另一种基于 itertools 的解决方案:
def natatime_25(itr, fillvalue=None, n=2):
x = itertools.chain(iter(itr), (fillvalue,) * (n-1))
return itertools.izip(*(x,)*n)
(因为2.5没有内置next,也没有izip_longest)。