Itération d'itérateurs en morceaux
Considérons un scénario dans lequel vous possédez un itérateur l = [1, 2, 3, 4, 5, 6 , 7] et souhaitez le partitionner en morceaux de taille 3, ce qui donne un itérateur contenant [[1, 2, 3], [4, 5, 6], [7]].
Solution itertools
La bibliothèque standard Python offre une solution pratique au sein du module itertools :
import itertools def grouper(iterable, n, *, incomplete='fill', fillvalue=None): """Collect data into non-overlapping fixed-length chunks or blocks.""" args = [iter(iterable)] * n if incomplete == 'fill': return zip_longest(*args, fillvalue=fillvalue) elif incomplete == 'strict': return zip(*args, strict=True) elif incomplete == 'ignore': return zip(*args) else: raise ValueError('Expected fill, strict, or ignore') chunks = list(grouper(l, 3)) # Output: [[1, 2, 3], [4, 5, 6], [7]]
Version améliorée de la bibliothèque standard
Une version spécialisée La fonction, par lots, introduite dans les versions récentes des recettes itertools, répond précisément à cette exigence de chunking :
from itertools import batched chunks = list(batched(l, 3)) # Output: [[1, 2, 3], [4, 5, 6], [7]]
Solution non générale
Pour les séquences en particulier, une solution plus simple L'approche qui gère efficacement les derniers morceaux est :
chunks = [my_list[i:i + chunk_size] for i in range(0, len(my_list), chunk_size)]
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!