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
?
$\begingroup$
$\endgroup$
3
$\begingroup$
$\endgroup$
1
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} *)
-
1$\begingroup$ I really don't get to use
Inner
enough. Love the use ofInner
for this problem. $\endgroup$ – march Sep 25 '15 at 17:19
$\begingroup$
$\endgroup$
3
Here's some ways. Using:
l = {1+2*s,2+3*s,4+1*s};
slist = {1, 2, 3};
The answer closest to what you asked is
{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}]
MapThread[ReplaceAll, {l, Thread[s -> 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]
-
2$\begingroup$ Hey, you even got the one with
Diagonal
! Nice work. You could avoid the extraneous computations I believe by usingDiagonal[l /. List /@ Thread[s -> slist]]
though I admit that is sadly not so pretty. $\endgroup$ – Mr.Wizard Jan 31 '16 at 7:09 -
$\begingroup$ @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). $\endgroup$ – march Jan 31 '16 at 7:15 -
2$\begingroup$ If I think if anything else that's not contrived I'll post it. $\endgroup$ – Mr.Wizard Jan 31 '16 at 7:19
$\begingroup$
$\endgroup$
2
{#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}]
/.
? $\endgroup$ – garej Jan 31 '16 at 7:42