MathGroup Archive 2003

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

Search the Archive

Re: split a list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg40595] Re: split a list
  • From: Dr Bob <majort at cox-internet.com>
  • Date: Thu, 10 Apr 2003 03:44:35 -0400 (EDT)
  • References: <r01050400-1024-B84930966B0A11D7ABA800039380220E@[192.168.1.100]>
  • Reply-to: majort at cox-internet.com
  • Sender: owner-wri-mathgroup at wolfram.com

Bill,

Your solution (the same as Jens-Peer Kuska's) IS simpler and clearer 
(though clarity is in the eye of the beholder!) -- but my timing 
comparisons disagree with yours.  Perhaps my environment is different 
(WinXP, 1024MB Ram, 2.2 GHz P4, Mathematica 4.2.1).  I have made a couple 
of improvements to my function, too:

treat3[test_List, m_] :=
  Flatten /@ Reap[Scan[Sow[#, If[# â?¤ m, 1, 2]] &, test], {1, 2}]

I don't have a big speed advantage over Kuska, but I think my method will 
scale to more breakpoints better, and I'm working on a solution for that 
case.

Perhaps you'd like to scale your method to more breakpoints?

The function's pattern would look like breakList[test_List, m_List], where 
m is unsorted.

(The method I have in mind doesn't benefit from having m presorted.)

Bobby

On Wed,  9 Apr 2003 21:13:01 -0700, Bill Rowe <listuser at earthlink.net> 
wrote:

> 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}
>



-- 
majort at cox-internet.com
Bobby R. Treat



  • Prev by Date: Re: split a list
  • Next by Date: Re: numerical integration
  • Previous by thread: Re: split a list
  • Next by thread: Re: split a list