3

Consider we have:

list = {{2, 3}, {3, 30}, {3, 2}, {4, 53}}

and we want to compare the first elements and sum the second elements if first elements are similar them we should get a array

newlist = {{2, 3}, {3, 32}, {4, 53}}

So I did the instruction bellow that did not workout.

Table[if[list[[i, 1]] == list[[i + 1, 1]], 
 {list[[i, 1]], list[[i, 2]] + list[[i + 1, 2]]}, 
 {list[[i, 1]], list[[i, 2]]}], {i, Length[list] - 1}]

How to work around?

Karsten7
  • 27,448
  • 5
  • 73
  • 134
rfmendes
  • 31
  • 2
  • Use If instead of if. Also take a look at patterns -- should be able to cope with difficulty. – Sektor Jul 04 '15 at 09:55

2 Answers2

5

There are a few approaches to this, e.g.

Last@Reap[Sow[#2, #1] & @@@ list, _, {#1, Total@#2} &]

or

List @@@ Normal[GroupBy[list, First -> Last, Total]]

or

{1/Length@#, 1} Total[#] & /@ GatherBy[list, First]

All yield:

{{2, 3}, {3, 32}, {4, 53}}
ubpdqn
  • 60,617
  • 3
  • 59
  • 148
2

Using patterns

list = {{2, 3}, {3, 30}, {3, 2}, {4, 53}};

list //. {s___, {a_, x_}, m___, {a_, y_}, e___} :>
  {s, {a, x + y}, m, e}

{{2, 3}, {3, 32}, {4, 53}}

Bob Hanlon
  • 157,611
  • 7
  • 77
  • 198