Re: Delete elements from list..
- To: mathgroup at smc.vnet.net
- Subject: [mg116622] Re: Delete elements from list..
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Tue, 22 Feb 2011 04:41:38 -0500 (EST)
Hi Maarten, here is one way: In[207]:= tst = {1, 2, 3, 4, 5, 6, 4, 5, 7, 8, 9} Out[207]= {1, 2, 3, 4, 5, 6, 4, 5, 7, 8, 9} In[208]:= Union[Rest[FoldList[Max, -Infinity, tst]]] Out[208]= {1, 2, 3, 4, 5, 6, 7, 8, 9} On my machine, for the list sizes you mention, this works in under a second: In[209]:= largeTest = RandomInteger[{1, 1000}, {1000, 1000}]; In[210]:= Map[Union[Rest[FoldList[Max, -Infinity, #]]] &, largeTest]; // Timing Out[210]= {0.782, Null} If you are ultimately for speed, and have a multi-core machine with a C compiler installed, then the following is much faster than the above code, although it won't win the beauty contest: fn = Compile[{{lst, _Integer, 1}}, Module[{i, temp, len = Length[lst], reslist, solctr}, For[reslist = Table[0, {len}]; temp = 0; i = solctr = 1, i <= len, i++, If[temp < lst[[i]], reslist[[solctr++]] = temp = lst[[i]]];]; Drop[reslist, -(len - solctr + 1)]], CompilationTarget -> "C", RuntimeAttributes -> Listable] For example: In[223]:= largeTest1 = RandomInteger[{1, 1000}, {10000, 1000}]; In[226]:= fn[largeTest1]; // AbsoluteTiming Out[226]= {0.0419922, Null} So, it is about 200 time faster (I have 6-core desktop, YMMV), than the shorter functional solution - this is pretty much the same speed you'd have for hand-written multi-threaded C, I guess. HTH. Regards, Leonid On Tue, Feb 22, 2011 at 3:30 AM, Maarten van der Burgt < Maarten.VanDerBurgt at kla-tencor.com> wrote: > Hallo, > > I have a list like: > > mylist = {1, 2, 3, 4, 5, 6, 4, 5, 7, 8, 9} > > I want to delete any element which is not strictly larger than the > previous element, until my new list has only increasing values. > > This means in mylist above I want to delete the 4 and the 5 at position > 7 and 8. > > Any elegant and fast way for doing this? > > In practice I want to do this for a large amount (1000) of very large > lists (1000). So speed is important. > > Thanks for your help. > > Maarten >