# 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) Commented Jan 31, 2016 at 7:15
• @Developer2000, is the idea of your question to avoid other structural constructs except /.? Commented Jan 31, 2016 at 7:42

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. Commented Jan 31, 2016 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). Commented Jan 31, 2016 at 7:15
• If I think if anything else that's not contrived I'll post it. Commented Jan 31, 2016 at 7:19
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. Commented Sep 25, 2015 at 17:19
l = {1 + 2*s, 2 + 3*s, 4 + 1*s};
slist = {1, 2, 3};


### SubsetMap

SubsetMap[slist &, Position[l, s]] @ l

{3, 8, 7}


### ReplaceAll

l /. s :> Last[slist = RotateLeft[slist]]

{3, 8, 7}

• +1 - a very useful (undocumented?) use of SubsetMap
– eldo
Commented Dec 30, 2023 at 8:34
a = {1 + 2*s, 2 + 3*s, 4 + 1*s};
b = {1, 2, 3};

ReplacePart[i_ :> (a[[i]] /. s :> b[[i]])] @ list


{3, 8, 7}

{#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}] Commented Jan 31, 2016 at 7:51
• ReplacePart[l, Thread[Position[l, s] -> {1,2,3}] Commented Jan 31, 2016 at 12:16

An alternative is to use MapAt and Diagonal as follows:

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

Diagonal@MapAt[b &, a, Position[a, s]]

(*{3, 8, 7}*)