6
$\begingroup$

There are two lists:

list1 = {{1, 2, 4}, {1, 3, 5}, {2, 5, 7}}; list2 = {{1, 2, 7}, {1, 3, 3}, {2, 5, 6}}; 

How can we subtract the last number of each row in list2 from list1 as

diff = {{1, 2, 3}, {1, 3, -2}, {2, 5, -1}} 
$\endgroup$

6 Answers 6

7
$\begingroup$
diff = list1; diff[[All, -1]] = Subtract[list2[[All, -1]], list1[[All, -1]]]; diff 

{{1, 2, 3}, {1, 3, -2}, {2, 5, -1}}

diff2 = list2; diff2[[All, -1]] -= list1[[All, -1]]; diff2 
{{1, 2, 3}, {1, 3, -2}, {2, 5, -1}} 
$\endgroup$
4
$\begingroup$

Another solution:

list1 // ReplacePart[ {i_, 3} :> Differences[ {list1, list2}, {1, 0} ][[ 1, i, 3]] ] 

{{1, 2, 3}, {1, 3, -2}, {2, 5, -1}}

$\endgroup$
4
$\begingroup$
a = {{1, 2, 4}, {1, 3, 5}, {2, 5, 7}}; b = {{1, 2, 7}, {1, 3, 3}, {2, 5, 6}}; 

Using SubsetMap (new in 12.0)

SubsetMap[Last /@ (b - a) &, a, {All, -1}] 

{{1, 2, 3}, {1, 3, -2}, {2, 5, -1}}

$\endgroup$
3
$\begingroup$

Try this:

Transpose[ Append[Transpose[list1 ][[1 ;; 2]], Last[Transpose[list2 ] - Transpose[list1 ]]]] (* {{1, 2, 3}, {1, 3, -2}, {2, 5, -1}} *) 

Have fun!

$\endgroup$
3
$\begingroup$
l1 = {{1, 2, 4}, {1, 3, 5}, {2, 5, 7}}; l2 = {{1, 2, 7}, {1, 3, 3}, {2, 5, 6}}; 

Using Thread and ReplaceAll:

rep = s_?VectorQ :> If[DuplicateFreeQ[s], Subtract @@ s, s[[1]]]; Thread /@ Thread[{l2, l1}] /. rep (*{{1, 2, 3}, {1, 3, -2}, {2, 5, -1}}*) 

Or using Map and Thread:

Map[x |-> {Splice@Most@x[[1]], x[[1, 3]] - x[[2, 3]]}, Thread[{l2, l1}]] (*{{1, 2, 3}, {1, 3, -2}, {2, 5, -1}}*) 
$\endgroup$
3
$\begingroup$

Using MapThread:

Clear["Global`*"]; list1 = {{1, 2, 4}, {1, 3, 5}, {2, 5, 7}}; list2 = {{1, 2, 7}, {1, 3, 3}, {2, 5, 6}}; MapThread[Most@#1~Join~{Last@#2 - Last@#1} &, {list1, list2}] 

or

MapThread[{#1[[1]], #1[[2]], #2[[3]] - #1[[3]]} &, {list1, list2}] 

Result:

{{1, 2, 3}, {1, 3, -2}, {2, 5, -1}}

$\endgroup$

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.