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