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