One-liner to merge lists?

Barry Scott barry at barrys-emacs.org
Sun Feb 27 03:51:36 EST 2022



> On 22 Feb 2022, at 09:30, Chris Angelico <rosuav at gmail.com> wrote:
> 
> On Tue, 22 Feb 2022 at 20:24, Frank Millman <frank at chagford.com <mailto:frank at 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.

Barry


> 
> ChrisA
> -- 
> https://mail.python.org/mailman/listinfo/python-list <https://mail.python.org/mailman/listinfo/python-list>


More information about the Python-list mailing list