給定兩個輸入引數:
x:<list>喜歡[0, 1, 2, 3]
splits:<list>的int表示數量和分割的長度,等[1, 2, 1]。這意味著串列必須分成 3 個,第一個包含 1 個元素,第二個包含 2 個元素,第三個拆分包含 1 個元素
我需要一個函式來回傳所有可能的拆分組合,例如:
def get_combos(x, splits): ...
>>> get_combos([0, 1, 2, 3], [1, 2, 1])
[(0,), (1, 2), (3,)]
[(0,), (1, 3), (2,)]
[(0,), (2, 3), (1,)]
[(1,), (0, 2), (3,)]
[(1,), (0, 3), (2,)]
[(1,), (2, 3), (0,)]
[(2,), (0, 1), (3,)]
[(2,), (0, 3), (1,)]
[(2,), (1, 3), (0,)]
[(3,), (0, 1), (2,)]
[(3,), (0, 2), (1,)]
[(3,), (1, 2), (0,)]
輸入將始終滿足以下條件:
min(splits) >= 1--> split中總有一個元素sum(splits) == len(x)--> 中的所有元素x都取
遞回執行的最佳方法是什么?
謝謝
uj5u.com熱心網友回復:
您可以使用遞回生成器函式:
def combos(a, b, c = []):
if not a or not b:
yield [*map(tuple, c)]
else:
for x, y in enumerate(a):
if not c or len(c[-1]) == b[0]:
yield from combos(a[:x] a[x 1:], b[1:] if c else b, c [[y]])
else:
yield from combos(a[:x] a[x 1:], b, [*c[:-1], c[-1] [y]])
print(list(combos([0, 1, 2, 3], [1, 2, 1])))
輸出:
[[(0,), (1, 2), (3,)], [(0,), (1, 3), (2,)], [(0,), (2, 1), (3,)], [(0,), (2, 3), (1,)], [(0,), (3, 1), (2,)], [(0,), (3, 2), (1,)], [(1,), (0, 2), (3,)], [(1,), (0, 3), (2,)], [(1,), (2, 0), (3,)], [(1,), (2, 3), (0,)], [(1,), (3, 0), (2,)], [(1,), (3, 2), (0,)], [(2,), (0, 1), (3,)], [(2,), (0, 3), (1,)], [(2,), (1, 0), (3,)], [(2,), (1, 3), (0,)], [(2,), (3, 0), (1,)], [(2,), (3, 1), (0,)], [(3,), (0, 1), (2,)], [(3,), (0, 2), (1,)], [(3,), (1, 0), (2,)], [(3,), (1, 2), (0,)], [(3,), (2, 0), (1,)], [(3,), (2, 1), (0,)]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/356407.html
