在不改变顺序的情况下拆分k个子集中的列表
所以我有一个列表说li=[1,4,2,5,2]
,这个列表将被分成
我想要这样输出的k=3子集
:
[
[1,4,2],[5],[2]],
[1,4],[2,5],[2],
[1,4],[2],[5,2],
[1],[4,2],[5,2],
[1],[4],[2,5,2],
]
回答
使用递归:
li = [1,4,2,5,2]
def subsets(d, k, c = []):
if len(c) == k and len(li) == sum(map(len, c)):
yield c
elif d:
if len(c) < k:
yield from subsets(d[1:], k, c+[[d[0]]])
if c:
yield from subsets(d[1:], k, [*c[:-1], c[-1]+[d[0]]])
print(list(subsets(li, 3)))
输出:
[[[1], [4], [2, 5, 2]],
[[1], [4, 2], [5, 2]],
[[1], [4, 2, 5], [2]],
[[1, 4], [2], [5, 2]],
[[1, 4], [2, 5], [2]],
[[1, 4, 2], [5], [2]]]