Re: split the sublists into parts according to some rules
- To: mathgroup at smc.vnet.net
- Subject: [mg127924] Re: split the sublists into parts according to some rules
- From: Bob Hanlon <hanlonr357 at gmail.com>
- Date: Sat, 1 Sep 2012 02:29:27 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <20120831075805.89DC96882@smc.vnet.net>
splitToParts[list_List, segments_Integer?Positive] := Module[{len, revList = Select[list, Length[#] >= segments &]}, (len = Floor[Length[#]/segments]; If[segments*len == Length[#], Partition[#, len], Join[ {Take[#, len + 1]}, splitToParts[ {Drop[#, len + 1]}, segments - 1][[1]] ]]) & /@ revList] theLongList = {{a, b, c, d, e}, {x, y, z}, {a1, a2, a3, a4}}; splitToParts[theLongList, 2] {{{a, b, c}, {d, e}}, {{x, y}, {z}}, {{a1, a2}, {a3, a4}}} splitToParts[theLongList, 3] {{{a, b}, {c, d}, {e}}, {{x}, {y}, {z}}, {{a1, a2}, {a3}, {a4}}} splitToParts[theLongList, 4] {{{a, b}, {c}, {d}, {e}}, {{a1}, {a2}, {a3}, {a4}}} Bob Hanlon On Fri, Aug 31, 2012 at 3:58 AM, Joug Raw <jougraw at gmail.com> wrote: > > Dear all, > > I have a long list which has many sublists inside, > > Thelonglist={{a,b,c,d,e},{x,y,z},{a1,a2,a3,a4},...} > > Each sublist has length > 1(no single element sublist exists) . And the > lengths of the sublists are different and unknow in advanced. The length of > some of the sublists are odd number, such as {a,b,c,d,e} and {x,y,z}. Some > sublists have even number list length, like {a1,a2,a3,a4}. > > What I want to achieved is to split each sublist into two (or three, or > more) parts. In the two parts case, if the length of original sublist is > even number, the two new parts will have same length, e.g, {a1,a2,a3,a4} > become {{a1,a2},{a3,a4}}. If the sublist has length in odd number, > after splitting one of the two parts should have one more element than the > other. > > That is, > Input: Thelonglist={{a,b,c,d,e}, {x,y,z}, {a1,a2,a3,a4},...} > Output: Newlist={{a,b,c}, {d,e}}, {{x,y}, {z}}, {{a1,a2}, {a3,a4}},...} > > Or the same idea for the three parts case, > Input: Thelonglist={{a,b,c,d,e}, {x,y,z}, {a1,a2,a3,a4},...} > Output: Newlist={{{a,b}, {c,d}, {e}}, {{x},{y},{z}}, {{a1}, {a2}, > {a3,a4}}, ...} > > For the case of 4 parts, the number 4 is larger than the length of some > sublists and I will abandon those list with short length. > Input: Thelonglist={{a,b,c,d,e}, {x,y,z}, {a1,a2,a3,a4},...} > Output: Newlist={{{a}, {b}, {c}, {d,e}}, {{a1}, {a2}, {a3}, {a4}}, ...} > > Could there be a simple function to achieve this idea generally? Say, a > function like *SplittoPart[**list_*, *partnumber_**]*, in which I just need > to give the input list and the number of parts of sublists I want to have. > Then it will do the job above. If the number of sublist is larger then the > length of some sublists, the function just abandon those short list and do > the split(or partition) work on the other lists with long enough length. > Could some one help me on this? > > If that is too complicated, I would still be happy to see some one could > give me a solution only for the case of splitting to two parts, > > Input: Thelonglist={{a,b,c,d,e}, {x,y,z}, {a1,a2,a3,a4},...} > Output: Newlist={{a,b,c}, {d,e}}, {{x,y}, {z}}, {{a1,a2}, {a3,a4}},...} > > Thanks a lot for your kind help! > >