MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Group and Replace itens sequence in a list


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->{n-1,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 UTC-3, 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}->{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
>>
>>>
>>
>>>
>>
>>
>>>> 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
>>
>>>
>>
>>>
>>
>>>
>




  • Prev by Date: Re: slide show questions
  • Next by Date: reduction/simplification of hypergeometric-function-related formula
  • Previous by thread: Re: Group and Replace itens sequence in a list
  • Next by thread: Re: Group and Replace itens sequence in a list