Le site grouper()
recette du itertools
de la documentation recettes se rapproche de ce que vous voulez :
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
Il remplira le dernier morceau avec une valeur de remplissage, cependant.
Une solution moins générale qui ne fonctionne que sur les séquences mais qui gère le dernier morceau comme souhaité est
[my_list[i:i + chunk_size] for i in range(0, len(my_list), chunk_size)]
Enfin, une solution qui fonctionne sur des itérateurs généraux et se comporte comme souhaité est
def grouper(n, iterable):
it = iter(iterable)
while True:
chunk = tuple(itertools.islice(it, n))
if not chunk:
return
yield chunk
3 votes
@kindall : C'est proche, mais pas identique, en raison de la gestion du dernier morceau.
5 votes
C'est légèrement différent, car cette question concernait les listes, et celle-ci est plus générale, les itérateurs. Bien que la réponse semble être la même au final.
0 votes
@recursive : Oui, après avoir lu le fil de discussion lié complètement, j'ai trouvé que tout dans ma réponse apparaît déjà quelque part dans l'autre fil de discussion.
0 votes
stackoverflow.com/a/312464/3798964