Possível duplicata:
como você divide uma lista em partes de tamanhos iguais no Python?
Estou surpreso por não conseguir encontrar uma função "batch" que receba como entrada um iterável e retorne um iterável de iteráveis.
Por exemplo:
for i in batch(range(0,10), 1): print i
[0]
[1]
...
[9]
ou:
for i in batch(range(0,10), 3): print i
[0,1,2]
[3,4,5]
[6,7,8]
[9]
Agora, eu escrevi o que pensei ser um gerador bem simples:
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
Mas o que precede não me dá o que eu esperava:
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]
Portanto, perdi algo e isso provavelmente mostra minha total falta de compreensão dos geradores Python. Alguém se importaria em me apontar a direção certa?
[Editar: eventualmente percebi que o comportamento acima ocorre apenas quando eu executo isso dentro do ipython, em vez do próprio python]