Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2012

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

Search the Archive

Re: split the sublists into parts according to some rules

  • To: mathgroup at smc.vnet.net
  • Subject: [mg127943] Re: split the sublists into parts according to some rules
  • From: Alexei Boulbitch <Alexei.Boulbitch at iee.lu>
  • Date: Tue, 4 Sep 2012 05:46:26 -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

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!


Hi, Joul,

The first that came into head is this function:

complexPartition[lst_List] := Module[{partOdd},
  partOdd[lst1_List] := Module[{lstTemp},
    lstTemp = Drop[lst1, 1];
    MapAt[Prepend[#, First[lst1]] &,
     Partition[lstTemp, Length[lstTemp]/2], {1}]
    ];
  If[EvenQ[Length[lst]], Partition[lst, Length[lst]/2], partOdd[lst]
   ]]
which is rather straightforward, and I guess a better solution might exist.=
 Nevertheless, check it:

complexPartition[{a, b, c, d, e, f, g, 1, 2, 3}]

{{a, b, c, d, e}, {f, g, 1, 2, 3}}

And taking your long list:


thelonglist = {{a, b, c, d, e}, {x, y, z}, {a1, a2, a3, a4}};

Map[complexPartition, thelonglist]

{{{a, b, c}, {d, e}}, {{x, y}, {z}}, {{a1, a2}, {a3, a4}}}

Have fun, Alexei


Alexei BOULBITCH, Dr., habil.
IEE S.A.
ZAE Weiergewan,
11, rue Edmond Reuter,
L-5326 Contern, LUXEMBOURG

Office phone :  +352-2454-2566
Office fax:       +352-2454-3566
mobile phone:  +49 151 52 40 66 44

e-mail: alexei.boulbitch at iee.lu







  • Prev by Date: Re: DSolve for a real function
  • Next by Date: Re: split the sublists into parts according to some rules
  • Previous by thread: Re: split the sublists into parts according to some rules
  • Next by thread: Re: Getting the Derivative of an HoldForm Expression