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