Python

【Python】frozensetの使い方と集合演算

この記事では、Pythonの frozenset について解説します。

frozenset は、更新できない(イミュータブルな) set です。

set(セット)の使い方と集合演算

それでは frozenset について見ていましょう!

frozensetとは?

frozenset は、set の基本的な性質を受け継いだ型となっています。

set と異なる点は、要素の追加や削除ができなくなっていることです。なので、add メソッド などの要素を変更するようなメソッドは定義されていません。

ただし、集合演算用のメソッドは存在するので、集合演算のみに使用するなら他で値を変更できない frozenset を使った方が安全に扱うことができます。

frozensetの特徴

これらのことを踏まえた上で使い方を見ていきましょう!

frozensetの使い方

frozenset の基本的な使い方を見ていきます。

生成

空の frozensetオブジェクト を生成するには、frozenset() を使います。

変数 = frozenset()

引数にイテラブルオブジェクトを渡すことで初期化できます。

変数名 = frozenset(イテラブルオブジェクト)

呼び出し

frozenset は、セットと同様にインデックスでアクセスすることができません。なので、一時的にリストに変換するか、for文 で要素を取り出しましょう。

# 初期化
fs = frozenset([1, 2, 3])

# リストに変換する
fs_list = list(fs)
print(fs_list[0])

# for文を使う
for val in fs:
    print(val)

サンプル

試しに frozenset を生成し、出力してみます。

fs = frozenset([1, 2, 3]) 

print(fs)
print(type(fs))

実行結果

frozenset({1, 2, 3})
<class 'frozenset'>

集合演算

frozenset は、set と同様に集合演算を行えます。

和集合

unionメソッド、または 演算子 を使って和集合を計算できます。和集合とは、「どちらか片方には存在する要素」のことです。

frozenset.union(イテラブルオブジェクト)

frozenset1 | frozenset2

サンプル

試しに和集合を計算してみましょう。

vals1 = frozenset([1, 2])
vals2 = frozenset([3, 4])

union = vals1.union(vals2)
print(union)

union = vals1 | vals2
print(union)

実行結果

frozenset({1, 2, 3, 4})
frozenset({1, 2, 3, 4})

unionメソッド には、複数の配列を指定可能で リスト・タプルも指定できます。

vals1 = frozenset([1, 2])
vals2 = frozenset([3, 4])

union = vals1.union(vals2, [5, 6], (7, 8))
print(union)

実行結果

frozenset({1, 2, 3, 4, 5, 6, 7, 8})

積集合

intersectionメソッド、または &演算子 を使って積集合を計算できます。積集合とは、「両方に入っている要素」のことです。

frozenset.intersection(イテラブルオブジェクト)

frozenset1 & frozenset2

サンプル

試しに積集合を計算してみましょう。

vals1 = frozenset([1, 2, 3])
vals2 = frozenset([2, 3, 4])

intersection = vals1.intersection(vals2)
print(intersection)

intersection = vals1 & vals2
print(intersection)

実行結果

frozenset({2, 3})
frozenset({2, 3})

intersectionメソッド は、複数の配列を指定可能でリストやタプルも指定できます。

vals1 = frozenset([1, 2, 3, 4])
vals2 = frozenset([2, 3, 4, 5])

intersection = vals1.intersection(vals2, [3, 4, 5, 6], (4, 5, 6, 7))
print(intersection)

実行結果

frozenset({4})

差集合

differenceメソッド、または -演算子 を使って差集合を計算できます。差集合とは、「ある集合から別の集合の要素を取り除いて残った要素」のことです。

frozenset.difference(イテラブルオブジェクト)

frozenset1 - frozenset2

サンプル

試しに差集合を計算してみましょう。

vals1 = frozenset([1, 2, 3])
vals2 = frozenset[(2, 3, 4])

difference = vals1.difference(vals2)
print(difference)

difference = vals1 - vals2
print(difference)

実行結果

frozenset({1})
frozenset({1})

differenceメソッド は、複数の配列を指定可能でリスト・タプルも指定できます。

vals = frozenset({1, 2, 3, 4, 5})

difference = vals.difference([2, 3], (4, 5))
print(difference)

実行結果

frozenset({1})

対称差集合

symmetric_differenceメソッド、または ^演算子 を使って対称差集合を計算できます。対称差集合とは、「どちらか片方のみに存在する要素」を集めます。

frozenset.symmetric_difference(セットまたはフローズンセット)

frozenset1 ^ frozenset2

サンプル

試しに対称差集合を計算してみましょう。

vals1 = frozenset({1, 2, 3})
vals2 = {2, 3, 4}

s_d = vals1.symmetric_difference(vals2)
print(s_d)

s_d = vals1 ^ vals2
print(s_d)

実行結果

frozenset({1, 4})
frozenset({1, 4})

symmetric_differenceメソッド は、同時に複数の配列を指定できません。同時に複数の計算がしたい場合は、演算子を使ってください。

vals1 = frozenset({1, 2, 3})
vals2 = {2, 3, 4}

s_d = vals1 ^ vals2 ^ {3, 4, 5}
print(s_d)

実行結果

frozenset({1, 3, 5})

まとめ

この記事では、frozenset の使い方を解説しました。

set よりもさらに縛りが強い frozenset ですが、集合演算に使う場合はこちらの方が安全に演算することができます。

では今回の内容はここまでです。それではまたどこかで〜( ・∀・)ノ

set(セット)の使い方と集合演算