3

I have a list $\{x,y,z,w,p\}$ and I want to replace $x,y,w$ by $q$. This works

{x,y,z,w,p}/.{x->q, y->q, p->q}

But is there a way to do this concisely? I tried the following, but doesn't work

{x,y,z,w,p}/.{(x || y || p) ->q}

Thanks in advance for any help.

Deep
  • 479
  • 2
  • 9

2 Answers2

5
{x, y, z, w, p} /. Alternatives[x, y, p] -> q (* or *)
{x, y, z, w, p} /. Thread[{x, y, p} -> q]

{q, q, z, w, q}

kglr
  • 394,356
  • 18
  • 477
  • 896
1
list = {x, y, z, w, p};

rep = {x, y, p};

pos = Position[list, Alternatives @@ rep]

{{1}, {2}, {5}}

Using MapAt to to replace with single symbol

MapAt[q &, pos] @ list

{q, q, z, w, q}

Using SubsetMap to replace with different symbols (thanks, E. Chan-López)

SubsetMap[{q, r, s} &, list, pos]

{q, r, z, w, s}

With ReplaceAt (new in 13.1) we can easily impose additional conditions

list = {x, 1, z, w, p};

ReplaceAt[_Symbol :> q, pos] @ list

{q, 1, z, w, q}

eldo
  • 67,911
  • 5
  • 60
  • 168