Write this accumuator in a functional style

Chris Angelico rosuav at gmail.com
Tue Jul 11 02:58:51 EDT 2017


On Tue, Jul 11, 2017 at 4:11 PM, Steven D'Aprano <steve at pearwood.info> wrote:
> I have a colleague who is allergic to mutating data structures. Yeah, I
> know, he needs to just HTFU but I thought I'd humour him.
>
> Suppose I have an iterator that yields named tuples:
>
> Parrot(colour='blue', species='Norwegian', status='tired and shagged out')
>
> and I want to collect them by colour:
>
> accumulator = {'blue': [], 'green': [], 'red': []}
> for parrot in parrots:
>     accumulator[parrot.colour].append(parrot)
>
>
> That's pretty compact and understandable, but it require mutating a bunch
> of pre-allocated lists inside an accumulator. Can we re-write this in a
> functional style?
>
> The obvious answer is "put it inside a function, then pretend it works by
> magic" but my colleague's reply to that is "Yes, but I'll know that its
> actually doing mutation inside the function".

It's a partitioning filter. (Three way, not the usual two, but same
same.) I've actually often wanted a quick way to write that - where
you divide a list into two according to "passes predicate" vs "fails
predicate". So if you find a really nice solution, I'm interested.

ChrisA



More information about the Python-list mailing list