Re: ReplacePart question (2)
- To: mathgroup at smc.vnet.net
- Subject: [mg13205] Re: ReplacePart question (2)
- From: "Allan Hayes" <hay at haystack.demon.cc.uk>
- Date: Mon, 13 Jul 1998 07:42:53 -0400
- References: <6nkvd3$17k@smc.vnet.net> <6nn9ng$583@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
I should have explained why I devised the previouly posted code for
MyReplacePart.
Tobias Oed has proposed using Fold, however this runs into difficulties
when one part to be replaced is a subpart of another:
expr={{a},b,c,d};
new={x,y,z};
pos={{1},{1,1},{4}} (* Positions of a and d in expr *);
npos={{2},{1},{3}}(* Positions of x and y in new - new could contain
other stuff *);
Fold[
ReplacePart[#1,
new,
First[#2],
Last[#2]
]&,
expr,
Thread[{pos,npos}]
]
ReplacePart::part: Part {1, 1} of {y, b, c, d} does not exist.
ReplacePart::psl:
Position specification z in
ReplacePart[{y, b, c, d}, {x, y, z}, {1, 1}, z]
is not an integer or a list of integers.
ReplacePart[{y, b, c, d}, {x, y, z}, {1, 1}, z]
This can be avoided by removing some {1,1} from pos and {1} from npos,
and this could be put into the program. The depth first search use by
ReplaceAll in the code for MyReplaceAll make automatically takes care
of this problem.
MyReplacePart[expr_, rep_, expos:{___List}, repos:{___List}]:=
Module[{f},
MapIndexed[f, expr,{0, Infinity}, Heads->True]/.
Thread[f[_,#]&/@expos ->Extract[rep,repos]]/.f->(#&) ]
MyReplacePart[expr, new, pos,npos]
{y, b, c, x}
------------------------------------------------------------- Allan
Hayes
Training and Consulting
Leicester UK
http://www.haystack.demon.co.uk
hay at haystack.demon.co.uk
voice: +44 (0)116 271 4198
fax: +44(0)116 271 8642