MathGroup Archive 1995

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

Search the Archive

Re: There must be a better way!

  • To: mathgroup at smc.vnet.net
  • Subject: [mg2349] Re: [mg2322] There must be a better way!
  • From: gaylord at uiuc.edu (richard j. gaylord)
  • Date: Fri, 27 Oct 1995 01:48:28 -0400
  • Organization: university of illinois

>  > From: mathgroup-adm
To: mathgroup at smc.vnet.net
>  > To: mathgroup
>  > Subject: [mg2322] There must be a better way!
>  > Date: Tuesday, October 24, 1995 2:14AM
>  >
>  >
>  > Hi.  I'm trying to write a function that partitions a list into
>  > segments of length given by another length. eg.
>  >         Given l1 = {A,B,C,D,E,F,G,H,I,J}
>  >         and   l2 = {2,3,4,1}
>  > I want to be able to say
>  >         In[1] := MyPartition[l1, l2]
>  > and get
>  >         Out[1] = {{A,B}, {C,D,E}, {F,G,H,I}, {J}}


if you want a function to divy up a list into parts, you can use 

split1[lis_, parts_] :=
  Module[{dog, cat}, 
     dog[y_, z_] := Take[lis,{y, z}];
     cat[x_] := Inner[dog, Drop[x, -1] + 1, Rest[x], List];  
     cat[FoldList[Plus, 0, parts]] ]

or

split2[lis_, parts_] := 
   Module[{pig},
      pig[x_] := Take[lis, x + {1, 0}];
      Map[pig, Partition[FoldList[Plus, 0, parts], 2, 1]] ]

or much neater looking yet, as a one-liner:

split2[lis_, parts_] := 
  Map[Take[lis, # + {1, 0}]&, Partition[FoldList[Plus, 0, parts], 2, 1]] 


note: these solutions are given in "Introduction to Programming with
Mathematica"  by Gaylord, Kamin and Wellin (the 2nd edition of this book
was just published).

-richard-

-- 
"if you're not programming functionally, then you're programming dysfunctionally"


  • Prev by Date: About Simplify
  • Next by Date: Newbie Q: - how do I add search paths correctly...
  • Previous by thread: Re: There must be a better way!
  • Next by thread: Re: There must be a better way!