One-liner to merge lists?

Frank Millman frank at chagford.com
Tue Feb 22 04:44:11 EST 2022


On 2022-02-22 11:30 AM, Chris Angelico wrote:
> On Tue, 22 Feb 2022 at 20:24, Frank Millman <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.
> 

Thanks, that is neat.

However, I did see this -

 >>> help(sum)
Help on built-in function sum in module builtins:

sum(iterable, /, start=0)
     Return the sum of a 'start' value (default: 0) plus an iterable of 
numbers

     When the iterable is empty, return the start value.
     This function is intended specifically for use with numeric values
and may reject non-numeric types.
 >>>

So it seems that it is not recommended.

I think I will stick with itertools.chain.

Frank



More information about the Python-list mailing list