Python で Powerset を探す

Hemank Mehtani 2023年1月30日
  1. Python で反復アプローチを使用してパワーセットを取得する
  2. Python で itertools.combinations 関数を使用してべき集合を検索する
  3. Python でリスト内包法を使用してべき集合を見つける
  4. Python で再帰的方法を使用してべき集合を見つける
Python で Powerset を探す

数学では、任意のセットのべき集合は、空のセットとともに、特定のセットのすべての可能なサブセットを含むセットです。言い換えると、セットのすべてのサブセットは、べき集合とも呼ばれます。Python には、リスト、セット、文字列などのべき集合が存在する可能性があります。

このチュートリアルでは、Python で特定のセットのべき集合を見つけます。

Python で反復アプローチを使用してパワーセットを取得する

再帰的アプローチと反復的アプローチの両方を使用してパワーセットを見つけることができますが、プロセスが高速であるため、再帰的アプローチよりも反復的アプローチの方が適しています。

ネストされた for ループを使用して、このようなべき集合を作成します。

例えば、

def powerset(fullset):
    listsub = list(fullset)
    subsets = []
    for i in range(2 ** len(listsub)):
        subset = []
        for k in range(len(listsub)):
            if i & 1 << k:
                subset.append(listsub[k])
        subsets.append(subset)
    return subsets


subsets = powerset(set([1, 2, 3, 4]))
print(subsets)
print(len(subsets))

出力:

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], [4], [1, 4], [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4]]
16

Python で itertools.combinations 関数を使用してべき集合を検索する

itertools は、データ構造を反復処理するために使用される Python のモジュールです。これらのデータ構造は、反復可能としても知られています。for ループを使用してステップオーバーできます。

このモジュールの combinations 関数は、セットの組み合わせを作成してパワーセットを作成できます。

以下のコードを参照してください。

from itertools import combinations


def powerset(string):
    n = len(string)
    for i in range(0, n + 1):
        for element in combinations(string, i):
            print("".join(element))


string = ["x", "y", "z"]
powerset(string)

出力:

x
y
z
xy
xz
yz
xyz

Python でリスト内包法を使用してべき集合を見つける

リスト内包表記は、既存のリストに基づいて新しいリストを作成する方法です。リストの作成に使用される他の関数やループよりもコンパクトで高速な短い構文を提供します。

このメソッドでも、ネストされた for ループを使用します。

例えば、

def get_subsets(fullset):
    listrep = list(fullset)
    n = len(listrep)
    return [[listrep[k] for k in range(n) if i & 1 << k] for i in range(2 ** n)]


string = ["x", "y", "z"]
print(get_subsets(string))

出力:

[[], ['x'], ['y'], ['x', 'y'], ['z'], ['x', 'z'], ['y', 'z'], ['x', 'y', 'z']]

Python で再帰的方法を使用してべき集合を見つける

再帰的メソッドは、関数がさまざまな引数でそれ自体を呼び出し続けるメソッドです。セットのべき集合を見つけるための再帰関数を作成できます。

例えば、

def powerSet(string, index, c):
    if index == len(string):
        print(c)
        return
    powerSet(string, index + 1, c + string[index])
    powerSet(string, index + 1, c)


s1 = ["a", "b", "c"]
index = 0
c = ""
powerSet(s1, index, c)

出力:

abc
ab
ac
a
bc
b
c

関連記事 - Python Set