Re: split a list
- To: mathgroup at smc.vnet.net
 - Subject: [mg40594] Re: split a list
 - From: Bill Rowe <listuser at earthlink.net>
 - Date: Thu, 10 Apr 2003 03:44:27 -0400 (EDT)
 - Sender: owner-wri-mathgroup at wolfram.com
 
On 4/9/03 at 8:27 PM, majort at cox-internet.com (Dr Bob) wrote:
>This is a beautiful application for Sow and Reap.
>
><< Experimental` testList[n_Integer] := Array[Random[] &, n]
>trial[n_Integer] := {testList@n, Random[]}
>
>breakList[test_List, break_] := Reap[If[# < break, Sow[#, 1], Sow[#,
>2]] & /@ test]
>
>trial@30 breakList @@ %
>
>That version may not be ideal, because if all elements are on the same
>side of the break point, you get only one list back -- not two, with
>one of them empty.  If that's a concern (but with thousands of
>elements it may never come up), this function fixes it:
>
>breakList2[test_List, break_] := Rest /@ Reap[Sow[0, #] & /@ {1,2};
>If[# < break, Sow[#, 1], Sow[#, 2]] & /@ test]
>
>Here's another solution to that problem:
>
>breakList3[test_List, break_] := Flatten /@ Reap[If[# < break, Sow[#,
>1], Sow[#, 2]] & /@ test, {1, 2}]
Interesting but the simple function
sp[x_List,m_]:={Select[x,#<m&], Select[x, #>m&]}
seems to be both more efficient and clearer as to intent
data = Table[Random[],{1000000}];
Timing[sp[data,.3];]
{1.41 Second,Null}
Timing[breakList2[data,.3];]
{1.96 Second,Null}
Timing[breakList3[data,.3];]
{1.71 Second,Null}