配列を分割した後の並びが変わらないもののみを列挙するという条件であれば、以下のような考えで実現できます。
配列を分割するn-1
本の棒をどこに挿入すればよいかという問題として考えればよいと思います。
棒の位置はN-1
個からn-1
個を選ぶ組み合わせで求めることができます。
Python
ではitertools.combinations
という関数があるのでそれが利用できます。
あとは先頭から棒の位置に従って配列を分割すればよいです。
Python
ではlst[start:end]
というスライス表記で簡単にできます。
Python
1import itertools
2
3def split(lst, n):
4 N = len(lst)
5 ret = []
6 for ps in itertools.combinations(range(1,N), n-1):
7 ps = [0] + list(ps) + [N] # コード単純化のため先頭と末尾の位置も加える
8 ret.append( [lst[s:e] for s,e in zip(ps, ps[1:])])
9 return ret
10
11lst = [1,2,3,4,5]
12
13for i in range(5):
14 ret = split(lst, i+1)
15 print(f'{i+1} {ret}')
16
17"""
181 [[[1, 2, 3, 4, 5]]]
192 [[[1], [2, 3, 4, 5]], [[1, 2], [3, 4, 5]], [[1, 2, 3], [4, 5]], [[1, 2, 3, 4], [5]]]
203 [[[1], [2], [3, 4, 5]], [[1], [2, 3], [4, 5]], [[1], [2, 3, 4], [5]], [[1, 2], [3], [4, 5]], [[1, 2], [3, 4], [5]], [[1, 2, 3], [4], [5]]]
214 [[[1], [2], [3], [4, 5]], [[1], [2], [3, 4], [5]], [[1], [2, 3], [4], [5]], [[1, 2], [3], [4], [5]]]
225 [[[1], [2], [3], [4], [5]]]
23"""