(ABC), (AB)(C), (AC)(B), (BC)(A), (A)(B)(C)
要素の数が4つまでであれば一つ一つ自力で書いていってもいいのですが、5つ以上になると組み合わせが50を超え、面倒な上に間違う可能性が高くなってしまいます。何かいい方法はないかとググってみたものの、探し方が悪いせいか見つかりませんでした。いまいちスマートではないのですが、何とか方法を思いついたので以下にそのPythonスクリプトを載せます。この方法ではitertoolsとmore_intertoolsというライブラリを使います。itertoolsはpythonに標準で入っていますが、more_itertoolsの方はpipかcondaでインストールする必要があります。
import itertools
import more_itertools
d = ['A','B','C']
n = len(d)
l = list(more_itertools.powerset(d))
m = []
for h in l[1:]:
m.append(''.join(list(h)))
r = []
for i in range(1,n+1):
r += list(itertools.combinations(m, i))
print([j for j in r if sorted("".join(list(j))) == d])
手順としては、最初にmore_itertools.powerset(d)で、各要素の全部分集合を生成します。次にグループ数ごとに、itertools.combinations(m, i)を使って部分集合の全ての組み合わせのリストを作成します。当然このリストの中には要素の数が異なっていたり重複が含まれていたりするので、最後にフィルタリングをかけます。このスクリプトを実行した結果は以下のようになります。
#要素がA,B,Cのとき
[('ABC',), ('A', 'BC'), ('B', 'AC'), ('C', 'AB'), ('A', 'B', 'C')]
#要素がA,B,C,Dのとき
[('ABCD',), ('A', 'BCD'), ('B', 'ACD'), ('C', 'ABD'), ('D', 'ABC'), ('AB', 'CD'), ('AC', 'BD'), ('AD', 'BC'),
('A', 'B', 'CD'), ('A', 'C', 'BD'), ('A', 'D', 'BC'), ('B', 'C', 'AD'), ('B', 'D', 'AC'), ('C', 'D', 'AB'),
('A', 'B', 'C', 'D')]