时的想法大厦由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