Re: Why chunks is not part of the python standard lib?

Discussion in 'Python' started by Mark Lawrence, May 1, 2013.

  1. On 01/05/2013 10:00, Oscar Benjamin wrote:
    > On 1 May 2013 08:10, Mark Lawrence <> wrote:
    >> On 01/05/2013 07:26, Ricardo Azpeitia Pimentel wrote:
    >>>
    >>> After reading How do you split a list into evenly sized chunks in
    >>> Python?
    >>>
    >>> <http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python>
    >>>
    >>> and seeing this kind of mistakes happening
    >>> https://code.djangoproject.com/ticket/18972 all the time.
    >>>
    >>> Why is not a |chunks| function in itertools?
    >>>
    >>> |grouper| from
    >>> http://docs.python.org/2/library/itertools.html#recipes doesn't have the
    >>> same behavior as |chunks |
    >>>
    >>> Example:
    >>> |
    >>>
    >>> |chunks([1, 2, 3, 4, 5], 3)
    >>> # Should return [[1, 2, 3], [4, 5]] or the iterator equivalent.|
    >>>
    >>> |Original Post on StackOverflow:
    >>>
    >>> http://stackoverflow.com/questions/16313008/why-chunks-is-not-part-of-the-python-standard-lib
    >>>

    >>
    >> Asked and answered a trillion times. There's no concensus on how chucks
    >> should behave.

    >
    > I'm not sure that's a valid argument against it since a chunks
    > function could just do a different thing depending on the arguments
    > given.
    >
    > The issue is around how to deal with the last chunk if it isn't the
    > same length as the others and I can only think of 4 reasonable
    > responses:
    >
    > 1) Yield a shorter chunk
    > 2) Extend the chunk with fill values
    > 3) Raise an error
    > 4) Ignore the last chunk
    >
    > Cases 2 and 4 can be achieved with current itertools primitives e.g.:
    > 2) izip_longest(fillvalue=fillvalue, *[iter(iterable)] * n)
    > 4) zip(*[iter(iterable)] * n)
    >
    > However I have only ever had use cases for 1 and 3 and these are not
    > currently possible without something additional (e.g. a generator
    > function).
    >
    > In any case a chunks function can simply take arguments to give all 4
    > behaviours:
    >
    > def chunks(iterable, chunksize, uneven='return_short', fillvalue=None):
    > # loop through yielding all even chunks
    > # and then
    > if uneven == 'return_short:
    > yield chunk
    > elif uneven == 'raise':
    > raise ValueError('No items left')
    > elif uneven == 'fill':
    > yield chunk + [fillvalue] * (chunksize - len(chunk))
    > elif uneven == 'ignore':
    > pass
    >
    >
    > Oscar
    >


    All that's needed to get this into the standard library is to overcome
    this quote "This has been rejected before." from
    http://bugs.python.org/issue6021#msg87745

    --
    If you're using GoogleCrap™ please read this
    http://wiki.python.org/moin/GoogleGroupsPython.

    Mark Lawrence
    Mark Lawrence, May 1, 2013
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ricardo Azpeitia Pimentel

    Why chunks is not part of the python standard lib?

    Ricardo Azpeitia Pimentel, May 1, 2013, in forum: Python
    Replies:
    0
    Views:
    73
    Ricardo Azpeitia Pimentel
    May 1, 2013
  2. Mark Lawrence
    Replies:
    0
    Views:
    76
    Mark Lawrence
    May 1, 2013
  3. Oscar Benjamin
    Replies:
    7
    Views:
    127
    Wolfgang Maier
    May 2, 2013
  4. Serhiy Storchaka
    Replies:
    1
    Views:
    88
    Paul Rubin
    May 1, 2013
  5. Fábio Santos
    Replies:
    0
    Views:
    86
    Fábio Santos
    May 2, 2013
Loading...

Share This Page