Re: A NewBie Question
- To: mathgroup at smc.vnet.net
- Subject: [mg53655] Re: A NewBie Question
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Fri, 21 Jan 2005 06:37:01 -0500 (EST)
- Organization: The University of Western Australia
- References: <csl14p$6s5$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
In article <csl14p$6s5$1 at smc.vnet.net>, Zhe Hu <iamhuzhe at gmail.com>
wrote:
> Is there a way to take parts of a list as follows:
>
> takeParts[{a,b,c,d,e,f,g,h,i}, {2,3,4}]
>
> {{a,b}, {c,d,e}, {f,g,h,i}}
This is an extension of the functionality provided by Partition.
> A tedious way might be transforming {2, 3, 4} into {{1,2}, {3,5}, {6,
> 9}} (by Fold) and then Part/@ onto it. Is there a simpler way to do
> it?
The best that I can come up with -- which is essentially the idea that
you have outlined -- but borrowing the use of Pad from Dr Bob, is
PartitionList[x_, i_] := Module[{n = FoldList[Plus, 0, i]},
PadRight[x, Last[n], x][[#]] & /@ (Most[n] + Range /@ i)]
This works fine on your example:
PartitionList[{a,b,c,d,e,f,g,h,i},{2,3,4}]
{{a, b}, {c, d, e}, {f, g, h, i}}
but it also handles the case where the sum of the length of the parts
does not coincide with the length of the list. For example,
PartitionList[{a,b,c,d,e,f,g,h,i},{2,3}]
{{a, b}, {c, d, e}}
and
PartitionList[{a,b,c,d,e,f,g,h,i},{2,3,4,0,7}]
{{a, b}, {c, d, e}, {f, g, h, i}, {}, {a, b, c, d, e, f, g}}
Cheers,
Paul
--
Paul Abbott Phone: +61 8 6488 2734
School of Physics, M013 Fax: +61 8 6488 1014
The University of Western Australia (CRICOS Provider No 00126G)
35 Stirling Highway
Crawley WA 6009 mailto:paul at physics.uwa.edu.au
AUSTRALIA http://physics.uwa.edu.au/~paul