On 2022-02-27 08:51, Barry Scott wrote:


On 22 Feb 2022, at 09:30, Chris Angelico <ros...@gmail.com> wrote:

On Tue, 22 Feb 2022 at 20:24, Frank Millman <fr...@chagford.com 
<mailto:fr...@chagford.com>> wrote:

Hi all

I think this should be a simple one-liner, but I cannot figure it out.

I have a dictionary with a number of keys, where each value is a single
list -

d = {1: ['aaa', 'bbb', 'ccc'], 2: ['fff', 'ggg']}

I want to combine all values into a single list -

ans = ['aaa', 'bbb', 'ccc', 'fff', 'ggg']

I can do this -

a = []
for v in d.values():
...   a.extend(v)
...
a
['aaa', 'bbb', 'ccc', 'fff', 'ggg']

I can also do this -

from itertools import chain
a = list(chain(*d.values()))
a
['aaa', 'bbb', 'ccc', 'fff', 'ggg']


Is there a simpler way?


itertools.chain is a good option, as it scales well to arbitrary
numbers of lists (and you're guaranteed to iterate over them all just
once as you construct the list). But if you know that the lists aren't
too large or too numerous, here's another method that works:

sum(d.values(), [])
['aaa', 'bbb', 'ccc', 'fff', 'ggg']

It's simply adding all the lists together, though you have to tell it
that you don't want a numeric summation.

If you code is performance sensitive do not use sum() as it creates lots of tmp 
list that are deleted.

I have an outstanding ticket at work to replace all use of sum() on lists as 
when we profiled it
stands out as a slow operation. We have a lots of list of list that we need to 
flatten.

I think that 'sum' uses '__add__' but not '__iadd__'.

If it copied the given value, if present, and then used '__iadd__', if present, wouldn't that speed it up?
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to