MathGroup Archive 2012

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

Search the Archive

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
>
>
>




  • Prev by Date: Re: How Expand?
  • Next by Date: Re: How Expand?
  • Previous by thread: Re: Group and Replace itens sequence in a list
  • Next by thread: Re: Group and Replace itens sequence in a list