2 回答

TA貢獻1824條經驗 獲得超6個贊
您可以使用一個函數從給定的起始編號迭代索引,默認為1, to n,產生從起始編號到索引的一系列數字,并遞歸地將遞歸調用中的子集與一個更高的起始索引和少一個子集,直到起始索引大于n或k變為1,此時應產生剩余范圍:
def get_subsets(n, k, s=1):
if s > n or k == 1:
yield [list(range(s, n + 1))] + [[] for _ in range(1, k)]
return
for i in range(s, n + 1):
for subsets in get_subsets(n, k - 1, i + 1):
yield [list(range(s, i + 1))] + subsets
以便:
for s in get_subsets(4, 2):
print(*s)
輸出:
[1] [2, 3, 4]
[1, 2] [3, 4]
[1, 2, 3] [4]
[1, 2, 3, 4] []
然后:
for s in get_subsets(4, 3):
print(*s)
輸出:
[1] [2] [3, 4]
[1] [2, 3] [4]
[1] [2, 3, 4] []
[1, 2] [3] [4]
[1, 2] [3, 4] []
[1, 2, 3] [4] []
[1, 2, 3, 4] [] []

TA貢獻1828條經驗 獲得超3個贊
我認為對切片進行簡單的列表理解就足夠了。您可能還想使用itertools.combinations:
import itertools
N = 4
K = 2
elements = list(range(1, N + 1))
final = [[elements[a:b] for a, b in zip([0] + cuts, cuts + [N])]
for cuts in (list(c) for c in itertools.combinations(elements, K - 1))]
for x in final:
print(*x)
輸出:
[1] [2, 3, 4]
[1, 2] [3, 4]
[1, 2, 3] [4]
[1, 2, 3, 4] []
添加回答
舉報