getting n items at a time from a generator

Kugutsumen kugutsumen at gmail.com
Thu Dec 27 07:17:30 EST 2007


On Dec 27, 7:07 pm, Paul Hankin <paul.han... at gmail.com> wrote:
> On Dec 27, 11:34 am, Kugutsumen <kugutsu... at gmail.com> wrote:
>
>
>
> > I am relatively new the python language and I am afraid to be missing
> > some clever construct or built-in way equivalent to my 'chunk'
> > generator below.
>
> > def chunk(size, items):
> >     """generate N items from a generator."""
> >     chunk = []
> >     count = 0
> >     while True:
> >         try:
> >             item = items.next()
> >             count += 1
> >         except StopIteration:
> >             yield chunk
> >             break
> >         chunk.append(item)
> >         if not (count % size):
> >             yield chunk
> >             chunk = []
> >             count = 0
>
> The itertools module is always a good place to look when you've got a
> complicated generator.
>
> import itertools
> import operator
>
> def chunk(N, items):
>     "Group items in chunks of N"
>     def clump((n, _)):
>         return n // N
>     for _, group in itertools.groupby(enumerate(items), clump):
>         yield itertools.imap(operator.itemgetter(1), group)
>
> for ch in chunk(7, range(30)):
>     print list(ch)
>
> I've changed chunk to return a generator rather than building a list
> which is probably only going to be iterated over. But if you prefer
> the list version, replace 'itertools.imap' with 'map'.
>
> --
> Paul Hankin

Thanks, I am going to take a look at itertools.
I prefer the list version since I need to buffer that chunk in memory
at this point.






More information about the Python-list mailing list