Re: Q: efficient list operation wanted
- To: mathgroup at smc.vnet.net
- Subject: [mg14002] Re: Q: efficient list operation wanted
- From: buttgereit at netcologne.de (Peter Buttgereit)
- Date: Sat, 12 Sep 1998 16:59:24 -0400
- Organization: Dipl.-Sportl. Peter Buttgereit
- References: <6tbvmg$mv1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
[This followup was posted to comp.soft-sys.math.mathematica and a copy
was sent to the cited author.]
Hi Klaus,
how about
ReplaceByStack[in_List,crit_,stack_List]:=Module[
{tmp,inrep=in,st=stack},
tmp=Sequence@@#&/@Position[in,crit];(*get positions of elements to be
repaced;apply Sequence[] to have
format compatible with Part[]*)
If[
Length[tmp]>Length[stack],
Message[
ReplaceByStack::stack,Length[tmp],Length[stack]
]
]; (*Error message if replacements
are
incomplete*)
(inrep[[ #[[1]] ]]=
Replace[ (*make list of replacements and*)
inrep[[ #[[1]] ]], (*do replace element by element*)
#[[2]]
])&/@Table[
{tmp[[i]], crit->stack[[i]]},
{i,1,Min[Length[stack],Length[tmp]]}
];
inrep (*return the modified list*) ];
In[9]:=
ReplaceByStack::stack=
"Stack given has Length `2`, replacements needed: `1`.\n
Only the first `2` hits were replaced.";
In[1]:=
L1 = {1,2,3,4,5,3,7,2,3,9}
Out[1]=
{1,2,3,4,5,3,7,2,3,9}
In[2]:=
L2 = {a, b, c}
Out[2]=
{a,b,c}
In[7]:=
ReplaceByStack[L1,3,L2]
Out[7]=
{1,2,a,4,5,b,7,2,c,9}
In[8]:=
ReplaceByStack[L1,3,{a,b}]
ReplaceByStack::"stack":
"Stack given has Length 2, replacements needed: 3.
Only the first 2 hits were replaced."
Out[8]=
{1,2,a,4,5,b,7,2,3,9}
Well ? not really without a loop since I still need the Table[] command.
However, the lists of elements to be replaced and the replacement stack
somehow have to be "aligned", coping with unequal length of the lists.
So, I think, in this problem we won't find an efficient way doing
without a loop.
Cheers,
Peter
In article <6tbvmg$mv1 at smc.vnet.net>, k.duellmann at uni-mannheim.deXXX
says...
> 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!
>
> PS. Remove XXX from my e-mail-address
>
> K. Duellmann
>
>