Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Memotong Iterator dengan Cekap dalam Python?

Bagaimanakah Saya Boleh Memotong Iterator dengan Cekap dalam Python?

Patricia Arquette
Patricia Arquetteasal
2024-11-29 08:51:101026semak imbas

How Can I Efficiently Chunk an Iterator in Python?

Lelaran Lelaran dalam Potongan

Pertimbangkan senario di mana anda memiliki lelaran l = [1, 2, 3, 4, 5, 6 , 7] dan ingin membahagikannya kepada ketulan saiz 3, menghasilkan iterator yang mengandungi [[1, 2, 3], [4, 5, 6], [7]].

Penyelesaian itertools

Perpustakaan standard Python menawarkan penyelesaian yang mudah dalam modul 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]]

Perpustakaan Standard Dipertingkat Versi

Fungsi khusus, berkumpulan, diperkenalkan dalam versi terbaharu resipi itertools, dengan tepat menangani keperluan chunking ini:

from itertools import batched

chunks = list(batched(l, 3))  # Output: [[1, 2, 3], [4, 5, 6], [7]]

Penyelesaian Bukan Umum

Untuk urutan khususnya, pendekatan yang lebih mudah yang mengendalikan bahagian terakhir dengan berkesan ialah:

chunks = [my_list[i:i + chunk_size] for i in range(0, len(my_list), chunk_size)]

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memotong Iterator dengan Cekap dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn