Pythonのfrozenset()関数とは?リストをイミュータブルに変換する方法を解説
Pythonのfrozenset()関数は、変更可能(ミュータブル)なリストを変更不可(イミュータブル)なオブジェクトへ変換するために使われます。たとえば、最初は要素を自由に書き換えられるリストを作成したものの、処理の途中からは要素の変更を禁止したいといったケースがあります。このような場面でfrozenset()関数を適用すれば、それ以降の意図しない変更を防ぐことができます。
構文
frozenset(iterable_object_name)
frozenset()には、リスト・タプル・文字列などのイテラブルなオブジェクトを渡します。戻り値は変更不能なセット(frozensetオブジェクト)です。
以下の例では、まずリストを作成して要素を変更し、その結果を出力します。続いてfrozenset()関数を適用した後、もう一度要素を変更しようとします。すると2段階目でエラーが発生し、オブジェクトがそれ以上変更できないことが示されます。
サンプルコード
# frozenset()適用前
some_days = ["Mom","Tue","Wed","Thu"]
# 要素を変更
some_days[2]="Fri"
print("some_days =",some_days)
# frozenset()を適用
fixed_days=frozenset(some_days)
print("fixed_days= ",fixed_days)
# frozensetの要素を変更しようとする
fixed_days[2]="Wed"
実行結果
上記のコードを実行すると、次のような出力が得られます。
some_days = ['Mom', 'Tue', 'Fri', 'Thu']
Traceback (most recent call last):
fixed_days= frozenset({'Thu', 'Mom', 'Fri', 'Tue'})
File "/py3.py", line 14, in
fixed_days[2]="Wed"
TypeError: 'frozenset' object does not support item assignment
実行結果を見ると、frozenset()を適用する前のリストsome_daysは要素の変更("Wed"→"Fri")が成功しています。一方、frozenset化したfixed_daysに対して要素を代入しようとすると、TypeError: 'frozenset' object does not support item assignmentというエラーが発生し、変更が拒否されていることがわかります。
frozensetの主な特徴
- イテラブルなオブジェクトを受け取り、変更不能なセットを返します。
- セットの一種のため、要素の順序は保持されず、重複する要素は自動的に削除されます。
- ハッシュ可能(hashable)であるため、辞書のキーや、別のsetの要素として利用できます。
add()やremove()といった変更系メソッドを持たず、要素の追加・削除・更新は一切できません。
このように、データを固定値として扱いたい場合や、誤って上書きされるのを防ぎたい場合に、frozenset()は安全なデータ保護の手段として有効です。
-
【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説
はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが
-
PythonでQuine(クワイン)プログラムを書いてみよう
「Quine(クワイン)」とは、入力を一切受け取らずに、自分自身のソースコードを出力する特殊なプログラムのことです。一見すると不思議な自己言及的な仕組みですが、実装にはいくつかの厳格なルールがあります。最も重要な条件は、プログラム内部からソースコードファイルを読み込んではいけないという点です。つまり、純粋にコード自身の論理だけで自分の内容を再現しなければなりません。 サンプルコード Pythonでは、わずか1行でQuineを実現できます。 a=a=%r;print (a%%a);print (a%a) 実行結果 a=a=%r;print (a%%a);print (a%a) ご覧のとお