How to add lists with unequal length?

Given lists of unequal lengths, I want to add them together element-wise, treating missing elements as zero. For example, {1, 2, 3} + {a, b} + {x} should give {1 + a + x, 2 + b, 3}.

How do I write a function to do this?

• for two lists, fadd[a_, b_] := (PadRight[a, Length@b] + b) /; Length[b] > Length[a]; fadd[a_, b_] := (PadRight[b, Length@a] + a) /; Length[a] > Length[b] should work. This can be modified for more than two lists. – acl Apr 1 '13 at 1:21

Plus @@ PadRight[{{1, 2, 3}, {a, b}, {x}}]


I think it can also work.

• Neat and simple,I can define fadd=Plus @@ PadRight[{##}]&; – novice Apr 1 '13 at 6:40

You can simply do a ragged transpose and then add, which saves you the trouble of having to pad the lists:

Total /@ Flatten[{{1, 2, 3}, {a, b}, {x}}, {2}]
(* {1 + a + x, 2 + b, 3} *)

• I notice you've exceeded 100 silver badges. Wow! :-) – Mr.Wizard Apr 1 '13 at 3:51
• Thanks, I've had it for a while now :) Now I need to catch the slow train to a list-manipulation gold to join you (you're just mere days away). – rm -rf Apr 1 '13 at 19:14
• This works, too: Total[Flatten[{{1, 2, 3}, {a, b}, {x}}, {2}], {2}] – J. M. is away Apr 11 '13 at 12:45

Using raggedMapThread from this answer we could write:

raggedMapThread[Plus, {{1, 2, 3}, {a, b}, {x}}]

{1 + a + x, 2 + b, 3}


This is can also be easily extended to additional dimensions:

raggedMapThread[Plus, {{{1}, {2, 3}}, {{a, b}, {q}}, {{x}}}, 2]

{{1 + a + x, b}, {2 + q, 3}}


Again for reference the code is:

raggedMapThread[f_, expr_, level_Integer: 1] :=
Apply[f, Flatten[expr, List /@ Range[2, level + 1]], {level}]