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)
lやoなどの重複した文字は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()を使い分けるとよいでしょう。





