ビルが、その代わりに、バイナリへの一定の範囲内の数字を変換する、あなただけのすべての組み合わせを取得するためにitertools.product
を使用することができます1
と0
(またはTrue
とFalse
)を使用して、それを「ins」と「outs」をフィルタリングするためのマスクとして使用します。
>>> 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以上を組み合わせたい場合は:あなたはまた、そのenumerate
理解のための関数を定義し、一度に両方の部分を行うことができます
>>> 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]]
条件を追加:
>>> [(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