건물, 대신 이진 특정 범위의 숫자를 변환, 당신은 단지 모든 조합을 얻을 수 itertools.product
을 사용할 수 있습니다 및 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