Re: Group and Replace itens sequence in a list
- To: mathgroup at smc.vnet.net
- Subject: [mg127835] Re: Group and Replace itens sequence in a list
- From: Fred Simons <f.h.simons at tue.nl>
- Date: Sat, 25 Aug 2012 04:27:21 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <20120823065202.F18956843@smc.vnet.net> <20120824090452.29BC26855@smc.vnet.net>
Solutions with pattern matching can be very elegant, such as Bob Hanlon's solution, but also tend to be very slow when the problem is a little bit larger. Here is a solution by finding the position of the triple {a,b,a} and then taking the parts of the list outside these triples. g[lst_] := With[{limits=Partition[Flatten[{1, Position[Partition[lst,3,1], {a,b,a}] /. {n_Integer}->{n-1,n+3},Length[lst]}],2]}, Take[lst, #]& /@ limits] In the following commands f is Bob's function: In[4]:= lst={1,2,3,a,b,a,4,5,6,a,b,c,7,8,9,a,b,a,10,11,12} ; z1=f[lst]; // Timing z2=g[lst]; // Timing z1===z2 Out[5]= {0.,Null} Out[6]= {0.,Null} Out[7]= True Both functions are fast enough. Now we make the list 500 times longer: In[12]:= lstt=Flatten[Table[lst, {500}],1]; z1=f[lstt]; // Timing z2=g[lstt]; // Timing z1===z2 Out[13]= {5.007632,Null} Out[14]= {0.015600,Null} Out[15]= True Fred Simons Eindhoven University of Technology Op 24-8-2012 11:04, Bob Hanlon schreef: > Clear[f] > > f[list_?VectorQ] := Cases[ > (list //. {s___, a, b, a, r___} -> {{s}, {r}}) /. > {} -> > Sequence[], _?VectorQ, Infinity] > > f[{1, 2, 3, a, b, a, 4, 5, 6, a, b, c, 7, 8, 9, a, b, a, 10, 11, 12}] > > {{1, 2, 3}, {4, 5, 6, a, b, c, 7, 8, 9}, {10, 11, 12}} > > f[{a, b, a, 1, 2, 3, a, b, a, 4, 5, 6, a, b, c, 7, 8, 9, a, b, a, 10, > 11, 12}] > > {{1, 2, 3}, {4, 5, 6, a, b, c, 7, 8, 9}, {10, 11, 12}} > > f[{1, 2, 3, a, b, a, 4, 5, 6, a, b, c, 7, 8, 9, a, b, a, 10, 11, 12, > a, b, a}] > > {{1, 2, 3}, {4, 5, 6, a, b, c, 7, 8, 9}, {10, 11, 12}} > > f[{a, b, a, 1, 2, 3, a, b, a, 4, 5, 6, a, b, c, 7, 8, 9, a, b, a, 10, > 11, 12, a, b, a}] > > {{1, 2, 3}, {4, 5, 6, a, b, c, 7, 8, 9}, {10, 11, 12}} > > > Bob Hanlon > > > On Thu, Aug 23, 2012 at 2:52 AM, Murta <rodrigomurtax at gmail.com> wrote: >> Hi All >> >> I have a simple problem that is: >> >> l={1,2,3,a,b,a,4,5,6,a,b,c,7,8,9,a,b,a,10,11,12} >> >> I want to replace all a,b,a sequence by X to get: >> >> l={1,2,3,X,4,5,6,a,b,7,8,9,X,10,11,12} >> >> Then I want to group it by X intervals as >> l={{1,2,3},{4,5,6,a,b,7,8,9},{10,11,12}} >> >> If I don't need to put the intermediate X, even better! >> I think the with pattern, RaplaceAll and DeleteCases I can do It. Some clue? >> Tks >> Murta >> >> >> > > > ----- > Geen virus gevonden in dit bericht. > Gecontroleerd door AVG - www.avg.com > Versie: 2012.0.2197 / Virusdatabase: 2437/5219 - datum van uitgifte: 08/23/12 > > >
- References:
- Group and Replace itens sequence in a list
- From: Murta <rodrigomurtax@gmail.com>
- Re: Group and Replace itens sequence in a list
- From: Bob Hanlon <hanlonr357@gmail.com>
- Group and Replace itens sequence in a list