Ответ 1
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
).