
Re: Group and Replace itens sequence in a list
Posted:
Aug 28, 2012 4:51 AM


This might come close to a more general position But is not so efficient in Timing as Partition/Position...
Clear[pos]
pos[lst_?VectorQ,pat_?VectorQ]:=Module[{len=Length[pat]1},Reap[Scan[If[lst[[#;;#+len]]==pat,Sow[#]]&,Range[Length[lst]len]]][[2,1]]]
Clear[u]
u[lst_]:=With[{limits=Partition[Flatten[{1,(pos[lst,{a,b,a}]/.n_Integer>{n1,n+3}),Length[lst]}],2]},Take[lst,#]&/@limits]
Clear[g] 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]
lstt=Flatten[Table[lst,{500}],1]; mmu = MaxMemoryUsed[]; z1=u[lstt];//Timing MaxMemoryUsed[]  mmu mmu = MaxMemoryUsed[]; z2=g[lstt];//Timing MaxMemoryUsed[]  mmu z1===z2
Out[199]= {0.053322,Null} Out[200]= 0 Out[202]= {0.025853,Null} Out[203]= 250064 Out[204]= True
Am 26.08.2012 um 08:51 schrieb Murta:
> Good point Fred > > You example remembered me I miss in Mathematica the possibility to = work with inter row operations in a simpler way (simpler than = ListConvolve). > For example, the Position function (or some new one) could looking for = not just one element in the list, but for sequence of elements too and = retur it position. With this option we could avoid to use partition in = your solution. > The problem with Partition in large list is the waste of memory. See = the example: > > data = RandomReal[1, 10^6] > m1 = ByteCount[data]; > m2 = ByteCount[Partition[data, 3, 1]]; > N@m2/m1 > Out[1]=3 > > We break the list and then search. The best performance way would be = search the sequence (a,b,a) without break it. > Map function to me is a good example of function that could have one = "MapOverPartition". It would save a lot of memory. > > tks > Murta > > On Saturday, August 25, 2012 5:26:30 AM UTC3, Fred Simons wrote: >> 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}>{n1,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 2482012 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 >> >>> >> >>> >> >> >>>> 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 >> >>> >> >>> >> >>> >

