時的想法大廈由Nunzio,但不是在一定範圍內,以二進制數字轉換,你可以使用itertools.product
讓所有組合1
和0
(或True
和False
),然後用它作爲過濾「ins」和「outs」的掩碼。
>>> lst = [1,2,3]
>>> products = list(product([1,0], repeat=len(lst)))
>>> [[lst[i] for i, e in enumerate(p) if e] for p in products]
[[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]
>>> [[lst[i] for i, e in enumerate(p) if not e] for p in products]
[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]
你也可以定義爲enumerate
理解的功能,並做兩個部分一氣呵成:在「範圍」列表中,你可以
>>> mask = lambda lst, p, v: [lst[i] for i, e in enumerate(p) if e == v]
>>> [(mask(lst, p, 1), mask(lst, p, 0)) for p in product([1,0], repeat=len(lst))]
[([1, 2, 3], []),
([1, 2], [3]),
([1, 3], [2]),
([1], [2, 3]),
([2, 3], [1]),
([2], [1, 3]),
([3], [1, 2]),
([], [1, 2, 3])]
如果您只想組合,帶2個或更多添加一個條件:
>>> [(mask(lst, p, 1), mask(lst, p, 0)) for p in product([1,0],repeat=len(lst)) if sum(p) >= 2]
或者使用numpy
陣列和利用numpy
先進的索引:
>>> arr = np.array([1,2,3])
>>> [(arr[p==1], arr[p==0]) for p in map(np.array, product([1,0], repeat=len(arr)))]
[(array([1, 2, 3]), array([])),
(array([1, 2]), array([3])),
(array([1, 3]), array([2])),
(array([1]), array([2, 3])),
(array([2, 3]), array([1])),
(array([2]), array([1, 3])),
(array([3]), array([1, 2])),
(array([]), array([1, 2, 3]))]
真的很好的實施! –
我喜歡這個解決方案!像夢一樣工作!謝謝 – Mark