[Python-ideas] grouping / dict of lists

Michael Selik mike at selik.org
Mon Jul 2 06:14:40 EDT 2018


On Mon, Jul 2, 2018 at 2:52 AM Michael Selik <mike at selik.org> wrote:

> On Mon, Jul 2, 2018 at 2:32 AM Nicolas Rolin <nicolas.rolin at tiime.fr>
> wrote:
>
>> I think the current default quite weird, as it pretty much account to a
>> count() of each key (which can be useful, but not really what I except from
>> a grouping). I would prefer a default that might return an error to a
>> default that says ok and output something that is not what I might want.
>> For example the default could be such that grouping unpack tuples (key,
>> value) from the iterator and do what's expected with it (group value by
>> key). It is quite reasonable, and you have one example with (key, value) in
>> your example, and no example with the current default. It also allows to
>> use syntax of the kind
>>
>> >grouping((food_type, food_name for food_type, food_name in foods))
>>
>> which is pretty nice to have.
>>
>
> I'm of two minds on this point. First, I agree that it'd be nice to handle
> the (key, value) pair case more elegantly. It comes to mind often when
> writing examples, even if proportionally less in practice.
>
> Second, I'll paraphrase "Jakob's Law of the Internet User Experience" --
> users spend most of their time using *other* functions. Because
> itertools.groupby and other functions in Python established a standard for
> the behavior of key-functions, I want to keep that standard.
>
> Third, some classes might have a rich equality method that allows many
> interesting values to all wind up in the same group even if using the
> default "identity" key-function.
>
> Thanks for the suggestion. I'll include it in the PEP, at least for
> documenting all reasonable options.
>


It might not be pure (does not default to identity key-function), but it
sure seems practical.

::

    from itertools import groupby as _groupby
    from operator import itemgetter

    def grouping(iterable, key=itemgetter(0)):
        '''
        Group elements of an iterable into a dict of lists.

        The ``key`` is a function computing a key value for each
        element.  Each key corresponds to a group -- a list of elements
        in the same order as encountered.

        By default, the key-function gets the 0th index of each element.

            .>>> grouping(['apple', 'banana', 'aardvark'])
            {'a': ['apple', 'aardvark'], 'b': ['banana']}

        '''
        groups = {}
        for k, g in _groupby(iterable, key):
            groups.setdefault(k, []).extend(g)
        return groups
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180702/04683b89/attachment.html>


More information about the Python-ideas mailing list