見出し画像

bit全探索

リストの要素の選び方をビット全探索で列挙する

def all_pattern(list):
    """リストの要素の取り出し方

    ビット全探索でリストから要素の取り出し方を全て列挙する

    NOTE: O(n) = n*2**n

    Args:
        list (list): 使える要素
    """
    n = len(list)
    for i in range(2 ** n):
        foo = []
        for j in range(n):
            if ((i >> j) & 1):   # 二進数iのj桁目が1ならlistのj番目の要素を追加する
                foo.append(list[j])
        yield foo

この関数にリストを渡すと全組み合わせがイテレーターになって帰ってきます。
使い方は下記のような感じです。
itertoolsに同じことができるのないのかなぁ

fruits = ['apple', 'melon', 'banana', 'orange']
for p in all_pattern(fruits):
    print(p)
# >>
[]
['apple']
['melon']
['apple', 'melon']
['banana']
['apple', 'banana']
['apple', 'melon', 'banana']




この記事が気に入ったらサポートをしてみませんか?