pythonのfrozenset型の紹介

Pythonで集合を扱うデータ型として一般的なのはset型だと思いますが、
実は集合を扱う組み込み型にfrozensetというものがあるのでその紹介です。

ドキュメント:set(集合)型 — set, frozenset

setとfrozensetの何が違うかというと、setはミュータブルで、frozensetはイミュータブルです。
リストとタプルのような関係ですね。

それぞれの主なメリット/デメリットをあげると、
set は要素の追加や削除ができ、frozensetはそれができません。一度定義したらそのままです。
また、setは辞書のキーや他の集合の要素には使えませんが、frozensetは使うことができます。

軽く動かしてみましょう。


# frozensetを定義する
frozenset_1 = frozenset({'a', 'b', 'c'})
print(frozenset_1)
# frozenset({'b', 'a', 'c'})

# setを定義する
set_1 = {'a', 'b', 'c'}
print(set_1)
# {'b', 'a', 'c'}

# setは要素の追加削除可能。
set_1.add("d")
set_1.remove("d")
print(set_1)
# {'b', 'a', 'c'}

sample_dict = {}
# frozenset は辞書のキーに使える
sample_dict[frozenset_1] = "value1"
print(sample_dict)
# {frozenset({'b', 'a', 'c'}): 'value1'}

# set は辞書のキーにできない
sample_dict[set_1] = "value2"
'''
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 sample_dict[set_1] = "value2"

TypeError: unhashable type: 'set'
'''

最近集合をハッシュキーに使いたいことがあり、無理やりタプルで代用するなど不便な思いをしていたので、
これを知ってコードがスッキリしました。

sample_dic[{“key1”, “key2”}] = “value1”
とるすことが不可能なので、代わりに下の二つを登録して、呼び出すときは逐一keyをタプル化するような不恰好なコードとはこれでサヨナラです。
sample_dic[(“key1”, “key2”)] = “value1”
sample_dic[(“key2”, “key1”)] = “value1”