MathGroup Archive 2003

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

Search the Archive

Re: Re: split a list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg40626] Re: [mg40566] Re: split a list
  • From: Dr Bob <majort at cox-internet.com>
  • Date: Fri, 11 Apr 2003 02:04:07 -0400 (EDT)
  • References: <b70boj$883$1@smc.vnet.net> <b70nvi$9ji$1@smc.vnet.net> <200304100739.DAA24217@smc.vnet.net>
  • Reply-to: majort at cox-internet.com
  • Sender: owner-wri-mathgroup at wolfram.com

Here's a variant that works properly (almost):

treat7[test_List, m_?NumericQ] := Block[{srt = Sort[Append[test, m],
   m < #1 || m > #2 &], pos},
    pos = Position[srt, m, 1, 1][[1, 1]];
    {Take[srt, {pos + 1, -1}], Take[srt, pos - 1]}
    ]

But it isn't very fast.

This solution, your solution, and RangeLists all get it wrong if m is 
already in the list.

Bobby

Display all headersDate: Thu, 10 Apr 2003 03:39:36 -0400 (EDT)From: 
To: mathgroup at smc.vnet.net
atelesforos at hotmail.com (Orestis Vantzos)To: mathgroup at smc.vnet.netSubject: [mg40626] 
[mg40566] Re: split a list
A faster function can be build based on the fact that Sort is
extremely fast even for rather large lists of numbers:

sortSplit[r_,m_]:=Module[{srt,pos},
   srt=Sort[r~Join~{m}];
   pos=Position[r,m,1,1][[1,1]];
   {Take[srt,pos-1], Take[srt, {pos+1,-1}]}]

First, add m into the list and sort it.
Now find the position of the first occurance of m and cut the
(sorted)list there.
On the left are all the numbers smallest than m and on the right the
greater/equal. We throw away the element at the position of the cut;
it is the m we added at the first step.

This function is >3 times faster than Jens' function on my system.

Orestis

Jens-Peer Kuska <kuska at informatik.uni-leipzig.de> wrote in message 
news:<b70nvi$9ji$1 at smc.vnet.net>...
> Hi,
> 
> lst = Table[Random[], {10000}];
> 
> (* your version *)
> 
> SplitAt[r_, m_] := Module[{tmp, u, v, i},
> u = v = {};
> For[i = 1, i <= Length[r], i++, tmp = r[[i]];
> If[tmp > m, AppendTo[u, tmp], AppendTo[v, tmp]];];
> {v, u}
> ]
> 
> (* a faster one *)
> 
> SplitAt1[r_, m_] := {Select[r, # < m &], Select[r, # >= m &]}
> 
> 
> Timing[SplitAt[lst, 0.5];]
> 
> {24.22 Second, Null}
> 

> and
> 
> Timing[SplitAt1[lst, 0.5];]
> 
> {0.6 Second, Null}
> 
> Regards
> Jens
> 
> Roberto Brambilla wrote:
> > > Hi,
> > > I have a list (very long, thousands, and unsorted) of numbers 
> r={n1,n2...}
> > and for a given a number m  I want to split it in the two sublists
> > (unsorted, same order) u={elements<m], v={elements>m}.
> > Now I use this *old-style*  method:
> > > u = v = {};
> > For[i = 1, i <= Length[r], i++,
> >   tmp = r[[i]];
> >   If[tmp > m , AppendTo[u, tmp], AppendTo[v, tmp]];
> >   ]
> > > Any suggestion for a more efficient (and elegant) method?
> > Also oneliners are well accepted.
> > > Many thanks, Roberto
> > > Roberto Brambilla
> > CESI
> > Via Rubattino 54
> > 20134 Milano
> > tel +39.02.2125.5875
> > fax +39.02.2125.5492
> > rlbrambilla at cesi.it




  • Prev by Date: Re: split a list
  • Next by Date: Re: Raster process
  • Previous by thread: Re: split a list
  • Next by thread: Re: Re: split a list