Pythonのfrozenset()とは?set()との違いと使い方をわかりやすく解説

Pythonには、複数の値を重複なしで扱う「set型」があります。

そのset型を**変更できない集合(immutableな集合)**として扱いたいときに使うのがfrozenset()です。

この記事では、Pythonのfrozenset()について、基本的な使い方からset()との違い、集合演算まで初心者向けに解説します。

frozenset()とは

frozenset()は、変更できない集合を作成するPythonの組み込み関数です。

基本的な書き方は次のとおりです。

frozenset(要素)

例えば、リストからfrozensetを作成できます。

numbers = frozenset([1, 2, 3, 4])

print(numbers)

実行結果:

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

set()と同じように、重複した値は1つにまとめられます。

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

print(numbers)

実行結果:

frozenset({1, 2, 3})

frozenset()とset()の違い

frozenset()set()の大きな違いは、要素を変更できるかどうかです。

項目 set frozenset
重複 できない できない
要素の追加 できる できない
要素の削除 できる できない
変更可能 ×
ハッシュ可能 ×
辞書のキー 基本的に不可 利用可能
集合演算

例えば、setではadd()を使って要素を追加できます。

numbers = {1, 2, 3}

numbers.add(4)

print(numbers)

一方、frozensetでは要素を追加できません。

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

numbers.add(4)

実行するとエラーになります。

AttributeError

frozensetは作成後に中身を変更できないためです。

frozenset()の基本的な使い方

リストから作成する

リストをfrozenset()に渡すことで、frozensetを作成できます。

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

print(numbers)
frozenset({1, 2, 3})

タプルから作成する

タプルも利用できます。

numbers = frozenset((1, 2, 3))

print(numbers)
frozenset({1, 2, 3})

文字列から作成する

文字列を渡すと、文字単位で集合になります。

chars = frozenset("hello")

print(chars)

loなどの重複した文字は1つにまとめられます。

frozenset({'h', 'e', 'l', 'o'})

frozenset()の重複は削除される

frozenset()はsetと同じく、同じ値を複数持つことができません。

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

print(numbers)
frozenset({1, 2, 3})

重複を除去したいものの、その集合自体は変更されたくない場合に便利です。

frozenset()は要素を変更できない

frozensetはimmutable(イミュータブル)なデータ型です。

つまり、一度作成した後に要素を追加・削除・変更することはできません。

例えば、次のコードは使えません。

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

numbers.add(4)

remove()も利用できません。

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

numbers.remove(2)

setのように内容を変更するメソッドはありません。

frozenset()は辞書のキーにできる

frozensetの重要な特徴の一つが、ハッシュ可能であることです。

そのため、辞書のキーとして利用できます。

permissions = {
    frozenset(["read", "write"]): "編集可能",
    frozenset(["read"]): "閲覧のみ"
}

print(permissions[frozenset(["read"])])

実行結果:

閲覧のみ

通常のsetは変更可能なので、辞書のキーにはできません。

permissions = {
    {"read", "write"}: "編集可能"
}

これはエラーになります。

一方、frozensetなら利用できます。

permissions = {
    frozenset(["read", "write"]): "編集可能"
}

frozenset()はsetの要素にもできる

frozensetはハッシュ可能なので、別のsetの要素として利用することもできます。

例えば、次のようなコードです。

groups = {
    frozenset([1, 2]),
    frozenset([3, 4])
}

print(groups)

通常のsetをsetの要素にすることはできません。

groups = {
    {1, 2},
    {3, 4}
}

これはエラーになります。

frozenset()でも集合演算ができる

frozensetは変更できませんが、集合演算は利用できます。

例えば、和集合です。

a = frozenset([1, 2, 3])
b = frozenset([3, 4, 5])

result = a | b

print(result)
frozenset({1, 2, 3, 4, 5})

共通する要素を取得する積集合も使えます。

result = a & b

print(result)
frozenset({3})

差集合も利用できます。

result = a - b

print(result)
frozenset({1, 2})

主な集合演算

演算子 意味
| 和集合 a | b
& 積集合 a & b
- 差集合 a - b
^ 対称差 a ^ b

frozenset()とset()は相互変換できる

setからfrozensetを作ることができます。

numbers = {1, 2, 3}

fixed_numbers = frozenset(numbers)

print(fixed_numbers)

逆に、frozensetをsetに変換することもできます。

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

numbers = set(fixed_numbers)

print(numbers)

つまり、

set → frozenset

frozenset → set

も可能です。

frozenset()の要素を確認する

in演算子を使えば、特定の値が含まれているか確認できます。

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

print(2 in numbers)
print(5 in numbers)

実行結果:

True
False

要素を変更できないだけで、setと同じように集合として値を検索できます。

frozenset()の要素数を調べる

len()を使うと要素数を取得できます。

numbers = frozenset([10, 20, 30])

print(len(numbers))

実行結果:

3

frozenset()を使うメリット

frozensetを使う主なメリットは、集合の内容を変更されたくないことを明確にできる点です。

例えば、プログラムの途中で誤って要素を追加・削除してほしくないデータには、frozensetが適しています。

また、辞書のキーやsetの要素として集合を利用できることも大きなメリットです。

frozenset()を使う場面

frozensetは、例えば次のような場面で利用できます。

frozenset()の注意点

frozensetは便利ですが、順番を保持するデータ型ではありません

例えば、

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

print(numbers)

とした場合、リストのように必ず

3, 1, 2

の順番で表示されるわけではありません。

順番を管理したい場合は、リストやタプルなど別のデータ型を検討しましょう。

また、frozensetの要素には、基本的にハッシュ可能なオブジェクトを使用する必要があります。

frozenset()まとめ

Pythonのfrozenset()は、変更できない集合を作成するための組み込み関数です。

基本的な使い方は次のとおりです。

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

set()と同じく重複を持ちませんが、frozenset()は作成後に要素を変更できません。

特に重要なのが、ハッシュ可能なので辞書のキーやsetの要素として利用できるという点です。

「重複のないデータを扱いたい」というだけならset()、「変更されない集合として扱いたい」という場合はfrozenset()を使い分けるとよいでしょう。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら