# How to replace an element in a list with an element in another list with matching indices

I have a list like this l = {1 + 2*s, 2 + 3*s, 4 + 1*s}, and I have calculated s = {1, 2, 3}. I need to replace s in l so that l = {1 + 2*1, 2 + 3*2, 4 + 1*3}. Is it possible to do that with ReplacAll (/.) and Rule?

• Somewhat related: (3858) – Mr.Wizard Jan 31 '16 at 7:15
• @Developer2000, is the idea of your question to avoid other structural constructs except /.? – garej Jan 31 '16 at 7:42

list={1+2*s,2+3*s,4+1*s};

sValues={1,2,3};


Using HoldForm to see the intermediate step

Inner[HoldForm[#1 /. s -> #2]&, list, sValues, List]

(*  {1+2 s/. s->1,2+3 s/. s->2,4+s/. s->3}  *)

%//ReleaseHold

(*  {3,8,7}  *)


Without the intermediate step

Inner[#1 /. s -> #2 &, list, sValues, List]

(*  {3,8,7}  *)

• I really don't get to use Inner enough. Love the use of Inner for this problem. – march Sep 25 '15 at 17:19

Here's some ways. Using:

l = {1+2*s,2+3*s,4+1*s};
slist = {1, 2, 3};


{1 + 2*s, 2 + 3*s, 4 + 1*s} /. s -> slist // Diagonal


However, that does 3^2 - 3 too many calculations, so here's some more ways.

Module[{i = 1}, l /. s :> slist[[i++]]]
MapThread[#1 /. s -> #2 &, {l, slist}]
ReplaceAll @@@ Transpose[{l, Thread[s -> slist]}]
Map[First@#1 /. s -> Last@#1 &, Transpose@{l, slist}]
MapIndexed[#1 /. s -> slist[[First@#2]] &, l]


If s is always going to be the list {1, 2, 3, ...}, then:

MapIndexed[#1 /. s -> First@#2 &, l]

• Hey, you even got the one with Diagonal! Nice work. You could avoid the extraneous computations I believe by using Diagonal[l /. List /@ Thread[s -> slist]] though I admit that is sadly not so pretty. – Mr.Wizard Jan 31 '16 at 7:09
• @Mr.Wizard. And I feel like I'm still missing some that are actually different in nature to those above (practically all of these rely on the same idea). My favorite is the PostIncrement one, though; one of my favorite slick tricks (that I learned here somewhere along the way). – march Jan 31 '16 at 7:15
• If I think if anything else that's not contrived I'll post it. – Mr.Wizard Jan 31 '16 at 7:19
{#1[[1]] /. s -> #2[[1]], #1[[2]] /. s -> #2[[2]], #1[[3]] /.
s -> #2[[3]]} &[{1+2*s,2+3*s,4+1*s}, {1,2,3}]

• Table[(#1[[i]] /. s -> #2[[i]]), {i, 3}] &[l,{1,2,3}] – garej Jan 31 '16 at 7:51
• ReplacePart[l, Thread[Position[l, s] -> {1,2,3}] – garej Jan 31 '16 at 12:16