Re: Q: efficient list operation wanted

*To*: mathgroup at smc.vnet.net*Subject*: [mg14006] Re: [mg13973] Q: efficient list operation wanted*From*: BobHanlon at aol.com*Date*: Sat, 12 Sep 1998 16:59:27 -0400*Sender*: owner-wri-mathgroup at wolfram.com

The following function handles the case when there are more instances in the target list of the target value to be replaced than there are elements in the replacement list (withList). It will "cycle" through the replacement list as often as necessary to replace all instances of the target value. substitute[targetList_List, withList_List, targetValue_] := Module[{n, replacements}, replacements = Nest[Prepend[#, withList]&, withList, Ceiling[Count[targetList, targetValue]/ Length[withList]]-1]//Flatten; n=0; targetList /. targetValue :> (n++; replacements[[n]])] L1 = {1, 2, 3, 4, 5, 3, 7, 2, 3, 9}; L2 = {a, b, c}; substitute[L1, L2, 3] {1,2,a,4,5,b,7,2,c,9} L1 = {1, 2, 3, 4, 5, 3, 7, 2, 3, 9, 3, 10, 3}; substitute[L1, L2, 3] {1,2,a,4,5,b,7,2,c,9,a,10,b} L1 = Table[5, {15}]; L2 = {a, b, c, d}; L3 = substitute[L1, L2, 5] substitute[L3, {1, 5, 9, 13}, a] {a,b,c,d,a,b,c,d,a,b,c,d,a,b,c} {1,b,c,d,5,b,c,d,9,b,c,d,13,b,c} Bob Hanlon ______________ My original response was unnecessarily complex. This simpler form also works: n=0; L1 /. 3 :> (n++; L2[[n]]) Bob Hanlon _______________ L1 = {1, 2, 3, 4, 5, 3, 7, 2, 3, 9}; L2 = {a, b, c}; n=0; L1 /. (x_/;x==3) :> (n++; L2[[n]]) {1,2,a,4,5,b,7,2,c,9} Bob Hanlon In a message dated 9/11/98 7:54:56 PM, k.duellmann at uni-mannheim.deXXX wrote: >I am looking for an efficient solution of the following problem: > >Given two lists L1 = {1,2,3,4,5,3,7,2,3,9} and L2 = {a, b, c} > >I want to replace all numbers 3 in L1 by the elements of L2 >successively, >that is the first 3 by a, the second 3 by b and the third 3 by c. That >is I want to get the following modified L1-list: {1,2,a,4,5,b,7,2,c,9}. > >Replace[] unfortunately replaces elements with a single element only. Is >there a chance to avoid hideous Do-Loops? > >Any hints are appreciated!