Re: Help on Partitions, Again!!!
- To: mathgroup at smc.vnet.net
- Subject: [mg24661] Re: Help on Partitions, Again!!!
- From: d8442803 at student.nsysu.edu.tw (Wen-Feng Hsiao)
- Date: Mon, 31 Jul 2000 09:23:28 -0400 (EDT)
- Organization: NSYSU
- References: <8lt1mt$2m2@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
> In[ ] = f [ {A,B,C,D,E,F},{3,3}] > Out [ ] = { { {A,B,C},{D,E,F} }, { { > A,B,F},{C,D,E}},...................} and so on. > In [ ] = Length[%] > Out [ ] = 10 Dear DeMelo, You can still make use of KSubsets to obtain what you want. A basic idea is: Suppose we want to partition a list into combinations with element numbers n1 and n2. Then we can use KSubsets to find the "combinations" of n1-element and n2-element, separately; followed by concating them, and checking if they fulfill the requirements: no duplication. Specifically, set1 = KSubsets[lst, n1]; set2 = KSubsets[lst, n2]; result = Select[Outer[List, n1, n2, 1], Union[Sequence@@#]==Length[lst]&]; result = Union[Sort /@ result]; (* remove duplicated lists *) The final function could be: << DiscreteMath`Combinatorica` comb[lst_List, parts_List] := Module[{len = Length[lst], partlen = Length[parts], sets, matches}, If[Plus @@ parts != len, Print["Partitions are not correct."]; Return[]]; sets = KSubsets[lst, #] & /@ parts; matches = Select[Flatten[Outer[List, Sequence @@ sets, 1], partlen - 1], Length[Union[Sequence @@ #]] == len &]; matches = Union[Sort[#] & /@ matches]; Return[matches];] In[7]:= comb[{a, b, c, d}, {2, 1, 1}] Out[7]= {{{a}, {b}, {c, d}}, {{a}, {c}, {b, d}}, {{a}, {d}, {b, c}}, {{b}, {c}, {a, d}}, {{b}, {d}, {a, c}}, {{c}, {d}, {a, b}}} In[8]:= comb[{a, b, c, d, e, f}, {3, 3}] Out[8]= {{{a, b, c}, {d, e, f}}, {{a, b, d}, {c, e, f}}, {{a, b, e}, {c, d, f}}, {{a, b, f}, {c, d, e}}, {{a, c, d}, {b, e, f}}, {{a, c, e}, {b, d, f}}, {{a, c, f}, {b, d, e}}, {{a, d, e}, {b, c, f}}, {{a, d, f}, {b, c, e}}, {{a, e, f}, {b, c, d}}} Regards, Wen-Feng