Comment diviser une liste en morceaux de taille égale ?
J'ai une liste de longueur arbitraire, et j'ai besoin de la diviser en morceaux de taille égale pour y effectuer des opérations. Il y a des façons évidentes de le faire, comme garder un compteur et deux listes, et lorsque la deuxième liste se remplit, l'ajouter à la première liste et vider la deuxième liste pour la prochaine série de données, mais cela est potentiellement extrêmement coûteux.
Je me demandais si quelqu'un avait une bonne solution pour des listes de n'importe quelle longueur, par exemple en utilisant des générateurs.
J'ai cherché quelque chose d'utile dans itertools
mais je n'ai rien trouvé d'évident. J'ai peut-être raté quelque chose, cependant.
Question connexe : [Quelle est la manière la plus "pythonique" d'itérer sur une liste par morceaux ?][1]
Voici un générateur qui produit les morceaux que vous voulez :
Si vous utilisez Python 2, vous devez utiliser
xrange()
au lieu derange()
:Vous pouvez aussi simplement utiliser la compréhension de liste au lieu d'écrire une fonction, bien que ce soit une bonne idée d'encapsuler les opérations de ce type dans des fonctions nommées pour que votre code soit plus facile à comprendre. Python 3 :
Version Python 2 :
Voici un générateur qui fonctionne sur des itérables arbitraires :
Exemple :
Si vous connaissez la taille de la liste :
Si vous ne le savez pas (un itérateur) :
Dans ce dernier cas, on peut le reformuler d'une manière plus belle si on peut être sûr que la séquence contient toujours un nombre entier de morceaux de taille donnée (c'est-à-dire qu'il n'y a pas de dernier morceau incomplet).