Posible duplicado:
¿Cómo se divide una lista en fragmentos de tamaño uniforme en Python?
Me sorprende no haber podido encontrar una función "por lotes" que tome como entrada un iterable y devuelva un iterable de iterables.
Por ejemplo:
for i in batch(range(0,10), 1): print i
[0]
[1]
...
[9]
o:
for i in batch(range(0,10), 3): print i
[0,1,2]
[3,4,5]
[6,7,8]
[9]
Ahora, escribí lo que pensé que era un generador bastante simple:
def batch(iterable, n = 1):
current_batch = []
for item in iterable:
current_batch.append(item)
if len(current_batch) == n:
yield current_batch
current_batch = []
if current_batch:
yield current_batch
Pero lo anterior no me da lo que hubiera esperado:
for x in batch(range(0,10),3): print x
[0]
[0, 1]
[0, 1, 2]
[3]
[3, 4]
[3, 4, 5]
[6]
[6, 7]
[6, 7, 8]
[9]
Entonces, me he perdido algo y esto probablemente muestra mi total falta de comprensión de los generadores de Python. ¿A alguien le importaría indicarme la dirección correcta?
[Editar: finalmente me di cuenta de que el comportamiento anterior ocurre solo cuando ejecuto esto dentro de ipython en lugar de python en sí]