5

I have a list $(d_1, d_2, .. d_k)$ and I want to create all sums that I get for adding only two elements for my list $(d_1+d_2, d_1+d_3,...d_{k-1}+d_k)$. The RotateLeft function gives me only some of my sums and I need all of them.

F'x
  • 10,817
  • 3
  • 52
  • 92
WayneGacy
  • 101
  • 1
  • 2

7 Answers7

8
l = {a, b, c, d};
Plus @@@ Subsets[l, {2}]
(*
  {a + b, a + c, a + d, b + c, b + d, c + d}
*)

edit

Some timings

Mathematica graphics

Dr. belisarius
  • 115,881
  • 13
  • 203
  • 453
7

Come downvote @Verde

l = {a, b, c, d}

l~Subsets~{2}~Total~{2}
Rojo
  • 42,601
  • 7
  • 96
  • 188
4
l = {a, b, c, d};

Let's make use of pattern matching ( even though there are faster methods especially for list manipulations) :

ReplaceList[ l, {___, x_, ___, y_, ___} -> x + y]
{a + b, a + c, a + d, b + c, b + d, c + d}   

Typically, efficiency of pattern matching solutions is worse than that of functional approach, nevertheless we point out a remarkable feature of the result of ReplaceList: it is identical with other (functional) methods, e.g. (taking a longer list) we have:

ls = {a, b, c, d, e, f, g, h, i, j, k, l, , m, n, o, p, q, r, s};

ReplaceList[ls, {___, x_, ___, y_, ___} -> x + y] == 
Plus @@@ Subsets[ls, {2}] == ls~Subsets~{2}~Total~{2} 
True
Artes
  • 57,212
  • 12
  • 157
  • 245
3

Something like :

data = {a, b, c, d}; 

Flatten[Table[data[[i]] + data[[j]], {i, 1, Length[data] - 1}, {j, i + 1, Length[data]}],1]

(* {a + b, a + c, a + d, b + c, b + d, c + d} *)

Alternatively (plus suggestion from @Oleksandr R.) :

Total /@ Subsets[data, {2}]

And just because RotateLeft was mentioned :

Union[Flatten[Total /@ Subsets[NestList[RotateLeft[#] &, data, Length[data] - 1], {2}], 1]]
Dr. belisarius
  • 115,881
  • 13
  • 203
  • 453
b.gates.you.know.what
  • 20,103
  • 2
  • 43
  • 84
3

Just to show that there's more than one way to do things in Mathematica:

test = {a, b, c, d, e};
Total /@ (Join @@ MapIndexed[Drop[#1, First[#2]] &,
          Outer[List, test, test]])
   {a + b, a + c, a + d, a + e, b + c, b + d, b + e, c + d, c + e, d + e}

Of course, Oleksandr's and Verde's suggestions are the more compact way of going about it.

J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574
2

Since somebody mentioned timings...

Module[{x = Outer[Plus, l, l]},
 Flatten[x[[#, # + 1 ;;]] & /@ Range[Length@x - 1]]]
Simon Woods
  • 84,945
  • 8
  • 175
  • 324
1
Subsets[Plus @@ l, {2}]
(* or Subsets[Total@l, {2}] *)

{a + b, a + c, a + d, b + c, b + d, c + d}

kglr
  • 394,356
  • 18
  • 477
  • 896