prograMing: ReplacePart problem
- To: mathgroup@smc.vnet.net
- Subject: [mg10638] prograMing: ReplacePart problem
- From: Xah Lee <xah@best.com>
- Date: Tue, 27 Jan 1998 03:10:03 -0500
"Scott Morrison" <scott@morrison.fl.net.au> wrote:
> I have a list of pairs of the form:
> gt»3,5},{{},6},{7,{}},{{},{}},{{},56},{{},3}};
>
> The empty lists inside pairs are being used as placeholders. I want to
> replace these with the elements of b: bº1,a2,a3,a4,a5,a6};
> hopefully resulting in the list
> {{3,5},{a1,6},{7,a2},{a3,a4},{a5,56},{a6,3}}
>
> I had thought that ReplacePart could do this
This is an interesting problem. Many people already gave solutions.
Here
I'll generalize this problem a bit.
Problem: Suppose you have an expression that contains n "slots" that
you
want to fill-in using another list of length n. How to do it?
The problem is not completly specified above because the correspondence
between slots in expr and replacementList is not clear. Since
Mathematica
expressions are just trees, each slot has an index. The length of
slot's
index may or may not be used to determine the replacement order. For
example, should a slot with index {1,1,1} come before or after another
slot
with index {1,2}? Anyhow, ReplaceParts should be the right function to
solve this problem. The current four-argument-form behavior of
ReplaceParts
is probably a bug. Here's a substitute.
Clear[ReplaceMultiplePart];
ReplaceMultiplePart::"usage" "ReplaceMultiplePart[expr,newPartList,positionIndexList] replaces
parts of
expr corresponding positionIndexList with newPartList. Usage Example:
ReplaceMultiplePartPart[f[1,2,3],{hal,x},{{0},{2}}]";
ReplaceMultiplePart[expr_,newParts_List,posIndexes_List]:
Fold[ReplacePart[#1,Sequence@@#2]&,expr,Transpose[{newParts,posIndexes}]];
Now we can use ReplaceMultiplePart to solve the generalized problem.
In[23]:Clear[aTree,replacementList];
aTreeûg[slot,{slot,p}][slot,slot],slot,m,slot[slot]];
replacementListºnge@7;
In[24]:possition[aTree,slot,Infinity,Heads->True]
Out[24]{{1,0,1},{1,0,2,1},{1,1},{1,2},{2},{4,0},{4,1}}
In[25]:(*assuming the order returned by Position is the desired one*)
ReplaceMultiplePart[aTree,replacementList,pos]
Out[25]f[g[1,{2,p}][3,4],5,m,6[7]]
Xah, xah@best.com
http://www.best.com/~xah/Wallpaper_dir/c0_WallPaper.html
Mathematics, when viewed from the right angle, can be as boring as one
could imagine. --Mathematcian's lore