Maison > développement back-end > Tutoriel Python > Comment puis-je fragmenter efficacement un itérateur en Python ?

Comment puis-je fragmenter efficacement un itérateur en Python ?

Patricia Arquette
Libérer: 2024-11-29 08:51:10
original
952 Les gens l'ont consulté

How Can I Efficiently Chunk an Iterator in Python?

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]]
Copier après la connexion

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]]
Copier après la connexion

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)]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal