import itertools
with open(fn) as f:
for line, line2 in itertools.izip_longest(f, f, fillvalue=''):
print line, line2
Ay, izip_longest
requiere Python 2.6 o superior; 2.5 solo tiene izip
, que truncaría la última línea si f
tiene un número impar de líneas. Es bastante fácil proporcionar la funcionalidad equivalente como generador, por supuesto.
Aquí hay una "N a la vez" más general iterador del envoltorio:
def natatime(itr, fillvalue=None, n=2):
return itertools.izip_longest(*(iter(itr),)*n, fillvalue=fillvalue)
itertools
es generalmente el mejor camino a seguir, pero, si se insistió en la aplicación por sí mismo, entonces:
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))
En 2.5, creo que el mejor enfoque no es en realidad un generador, pero otra solución basada itertools-:
def natatime_25(itr, fillvalue=None, n=2):
x = itertools.chain(iter(itr), (fillvalue,) * (n-1))
return itertools.izip(*(x,)*n)
(ya que 2.5 no tiene incorporado next
, así como izip_longest
faltante).
+1: sugerencia para el generador en Py2.5 –
nunca prestó atención a el parámetro 'default' de' next', gracias por señalar eso. – SilentGhost
try/except parece simple y claro (y no sería necesario si pudiéramos garantizar un número par de líneas). ¿Por qué preferirías escribir un generador aquí? ¿No necesitaría el generador una prueba/excepto? – foosion