Pythonのfrozenset()関数を徹底解説!変更不能な集合の活用


 

Pythonには、ユニークな要素の集まりを扱うための**set(集合)型があります。しかし、このsetは作成後に要素を追加したり削除したりできる「変更可能(ミュータブル)」な型です。特定の状況では、一度作ったら変更できない「不変(イミュータブル)」な集合が必要になります。そこで登場するのが、Pythonのfrozenset()関数**です。この記事では、frozenset()関数の基本的な使い方から、setとの違い、そして具体的な活用事例までを初心者にもわかりやすく解説します。

 

frozenset()関数とは?Pythonにおける不変な集合の生成

 

Pythonのfrozenset()関数は、変更不可能な集合(frozenset object)を生成するための組み込み関数です。一度frozensetとして作成されたオブジェクトは、その後の要素の追加、削除、変更が一切できません。

 

setfrozensetの決定的な違い

 

この2つの型の最大の違いは、変更可能かどうかという点です。

特徴 set (集合) frozenset (不変集合)
変更可能性 可変(ミュータブル) 不変(イミュータブル)
用途 要素の動的な追加・削除 固定されたユニークな要素の集まり
ハッシュ化 できない できる(ハッシュ可能)
辞書のキー なれない なれる

「ハッシュ化できる(ハッシュ可能)」という性質は、frozensetdictのキーや別のsetの要素として利用できることを意味します。これがfrozensetの主な利点の一つです。

 

frozenset()関数の基本的な使い方

 

frozenset()関数は、引数としてイテラブル(リスト、タプル、文字列、既存のsetなど)を受け取り、その要素からユニークな要素のみを持つ不変な集合を生成します。

 

1. 空の不変集合の生成

 

引数を指定しない場合、空の不変集合を生成します。

Python
 
empty_frozenset = frozenset()
print(empty_frozenset) # 出力: frozenset()
print(type(empty_frozenset)) # 出力: <class 'frozenset'>

 

2. イテラブルから生成

 

リスト、タプル、文字列、既存のsetなどを引数に指定すると、その要素からユニークな要素を持つfrozensetを生成します。重複する要素は自動的に排除されます。

Python
 
# リストからfrozensetを生成
my_list = [1, 2, 3, 2, 1]
fset_from_list = frozenset(my_list)
print(fset_from_list) # 出力: frozenset({1, 2, 3})

# 文字列からfrozensetを生成(文字単位で分割され、ユニークな文字が集合になる)
my_string = "hello"
fset_from_string = frozenset(my_string)
print(fset_from_string) # 出力: frozenset({'o', 'e', 'l', 'h'}) (順序は保証されない)

# 既存のsetからfrozensetを生成
my_set = {10, 20, 30}
fset_from_set = frozenset(my_set)
print(fset_from_set) # 出力: frozenset({10, 20, 30})

 

要素の追加や削除はできない

 

frozensetは不変なので、add()remove()clear()などの変更操作は実行できません。実行しようとするとAttributeErrorが発生します。

Python
 
# fset = frozenset({1, 2, 3})
# fset.add(4) # AttributeError: 'frozenset' object has no attribute 'add'

 

frozensetオブジェクトの操作

 

frozensetは不変ですが、集合としての基本的な操作(和集合、積集合、差集合など)は行えます。これらの操作は、新しいfrozensetオブジェクトを返します。

Python
 
set_a = frozenset({1, 2, 3})
set_b = frozenset({3, 4, 5})

# 和集合 (Union)
print(set_a | set_b) # 出力: frozenset({1, 2, 3, 4, 5})
print(set_a.union(set_b)) # 同じ

# 積集合 (Intersection)
print(set_a & set_b) # 出力: frozenset({3})
print(set_a.intersection(set_b)) # 同じ

# 差集合 (Difference)
print(set_a - set_b) # 出力: frozenset({1, 2})
print(set_a.difference(set_b)) # 同じ

# 対称差集合 (Symmetric Difference)
print(set_a ^ set_b) # 出力: frozenset({1, 2, 4, 5})
print(set_a.symmetric_difference(set_b)) # 同じ

# 部分集合 (Subset) と上位集合 (Superset) のチェック
print(frozenset({1, 2}).issubset(set_a)) # 出力: True
print(set_a.issuperset(frozenset({1, 2}))) # 出力: True

 

frozenset()関数の活用事例

 

 

1. 辞書(dict)のキーとして使用

 

Pythonの辞書は、キーとしてハッシュ可能なオブジェクトしか受け付けません。setは変更可能なためハッシュ化できませんが、frozensetは不変であるためハッシュ化可能であり、辞書のキーとして使用できます。これは、複数の条件の組み合わせなどをキーとして管理したい場合に非常に便利です。

Python
 
# frozensetを辞書のキーとして使用する例
permissions = {
    frozenset({'read', 'write'}): "管理者",
    frozenset({'read'}): "閲覧者",
    frozenset(): "ゲスト" # 空のfrozensetもキーになれる
}

user_roles = frozenset({'read', 'write'})
print(f"このユーザーの役割: {permissions[user_roles]}") # 出力: このユーザーの役割: 管理者

 

2. 別のsetの要素として使用

 

set自体もハッシュ可能な要素しか格納できません。したがって、集合の集合(集合のネスト)を作成したい場合、内部の集合はfrozensetである必要があります。

Python
 
# frozensetをsetの要素として使用する例
all_combinations = {
    frozenset({'A', 'B'}),
    frozenset({'C'}),
    frozenset({'A', 'C'})
}
print(all_combinations)
# 出力例: {frozenset({'A', 'C'}), frozenset({'C'}), frozenset({'A', 'B'})}

 

3. 関数引数やハッシュが必要なデータ構造

 

関数に渡す引数が、意図せず変更されてしまうことを防ぎたい場合にfrozensetを利用できます。また、ハッシュ値を計算する必要がある場面(キャッシュのキーなど)でも利用されます。

 

4. 複数条件の組み合わせ管理

 

例えば、あるオブジェクトが持つ複数の特性の組み合わせをユニークなキーとして管理したい場合に、その特性の集合をfrozensetとして表現することで、効率的に処理できます。

 

frozenset()関数と関連する型

 

 

set()

 

set()は変更可能な集合を生成します。要素の追加や削除が頻繁に行われる場合や、ハッシュ化が不要な場合はsetを使用します。

 

tuple()list()との関係

 

frozensetが不変である点はtupleに似ていますが、frozensetは順序を持たず、重複する要素を許しません。一方、tupleは順序を持ち、重複も許します。listは順序を持ち、重複も許す変更可能なシーケンスです。

変更可能性 順序 重複 ハッシュ可能
list 可変 あり 許す できない
tuple 不変 あり 許す できる
set 可変 なし 許さない できない
frozenset 不変 なし 許さない できる

 

まとめ

 

Pythonのfrozenset()関数は、不変でハッシュ可能な集合オブジェクトを生成するための重要なツールです。set型が提供する集合演算の能力を維持しつつ、変更不可能な特性を付与することで、辞書のキーや別の集合の要素として利用できるなど、より多様なデータ構造やアルゴリズムの構築を可能にします。

  • frozenset()関数は、引数に指定されたイテラブルから不変な集合を生成します。

  • setとは異なり、一度作成されると要素の追加・削除・変更はできません。

  • 不変であるため、ハッシュ可能であり、辞書のキーや他のsetの要素として使用できます。

  • 和集合、積集合などの集合演算は可能ですが、新しいfrozensetオブジェクトが返されます。

この関数を理解し適切に使いこなすことで、Pythonでのデータ構造の設計やアルゴリズムの実装において、柔軟性と堅牢性を両立させることができるでしょう。


■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座