Re: split a list
- To: mathgroup at smc.vnet.net
- Subject: [mg40566] Re: split a list
- From: atelesforos at hotmail.com (Orestis Vantzos)
- Date: Thu, 10 Apr 2003 03:39:36 -0400 (EDT)
- References: <b70boj$883$1@smc.vnet.net> <b70nvi$9ji$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
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
- Follow-Ups:
- Re: Re: split a list
- From: Dr Bob <majort@cox-internet.com>
- Re: Re: split a list
- From: Dr Bob <majort@cox-internet.com>
- Re: Re: split a list