Re: need something like ReplaceAllIndexed[]
- To: mathgroup at smc.vnet.net
- Subject: [mg108482] Re: need something like ReplaceAllIndexed[]
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Fri, 19 Mar 2010 06:45:42 -0500 (EST)
- References: <201003190746.CAA08417@smc.vnet.net>
Hi Roger, I am not sure if I understood correclty what you want, but you can use the following In[2]:= Clear[replaceLeaves]; replaceLeaves[expr_, lst_List] /; Length[Level[expr, {-1}]] == Length[lst] := Module[{n = 1}, MapIndexed[lst[[n++]] &, expr, {-1}]]; to replace all leaves in your expression, in the order corresponding to a depth-first traversal of an expression, by consecutive elements of another list. For instance, In[4]:= replaceLeaves[b[a[c], a[c], a[d]], {e, f, g}] Out[4]= b[a[e], a[f], a[g]] Here is another alternative: Clear[replaceLeavesAlt]; replaceLeavesAlt[expr_, lst_List] /; Length[Level[expr, {-1}]] == Length[lst] := ReplacePart[expr, lst, Position[expr, _, {-1}, Heads -> False], List /@ Range[Length[lst]]] In[11]:= replaceLeavesAlt[b[a[c], a[c], a[d]], {e, f, g}] Out[11]= b[a[e], a[f], a[g]] Regards, Leonid On Fri, Mar 19, 2010 at 10:46 AM, divisor <congruentialuminaire at yahoo.com>wrote: > Hello mathGroup: > > I have an expression like this: > > b[ a[c], a[c], a[d]] > > a list like this: > > {e,f,g} > > I want to end up with > > b[ a[e], a[f], a[g]] > > I think of this as interleaving a list into an expression, but all my > tries with ./,.//,MapIndexed[],MapAt[], Partition[Riffle[]] have come > to no avail. > > Any help on this is greatly appreciated. > > Roger Williams > Franklin Laboratory > http://www.youtube.com/congruentlight > >
- References:
- need something like ReplaceAllIndexed[]
- From: divisor <congruentialuminaire@yahoo.com>
- need something like ReplaceAllIndexed[]