ここまでに見てきた、集合の和/差/積/対称差を求める操作はいずれも、複数の集合(メソッドを使った場合は反復オブジェクトのこともある)から新しい集合を作成するものだった。だが、和/差/積/対称差を求めて、それらで元の集合を更新することも可能だ。分かりやすくいうと「集合1 += 集合2」により「集合1と集合2の和を求めて、それを集合1の値とする」といった操作が可能だということだ。
これらの操作についても、和/差/積/対称差を求めるメソッドと演算子が用意されている。メソッドには全て「update」という語が含まれていることに注目しよう。
操作 | 方法 |
---|---|
和を求めて、元の集合を更新する | updateメソッド、|=演算子 |
差を求めて、元の集合を更新する | difference_updateメソッド、-=演算子 |
積を求めて、元の集合を更新する | intersection_updateメソッド、&=演算子 |
対称差を求めて、元の集合を更新する | symmetric_difference_updateメソッド、^=演算子 |
和/差/積/対称差を求めて、元の集合を更新するメソッドと演算子 |
これらのメソッドと演算子の基本的な使い方は上で紹介したものと同様だ。ただし、メソッドを呼び出しても、戻り値として新しい集合が返されるのではなく、元の集合が変更される点と、演算子については「集合1 |= 集合2 | 集合3 | ……」のように複数の集合をつなげて記述できる点には注意しよう。また、「集合1 = 集合1 | 集合2」は「集合1と集合2の和を表す新たな集合を集合1に代入する」操作であり、「集合1 |= 集合2」は「集合1と集合2の和で集合1を更新する」操作である点にも注意が必要だ(前者では集合1は、以前とは別のオブジェクトを参照するが、後者はあくまでも元の集合1を更新する処理となる)。
以下に幾つか例を示す。
myset1 = set(range(0, 10, 2)) # {0, 2, 4, 6, 8}
myset2 = set(range(1, 11, 2)) # {1, 3, 5, 7, 9}
myset3 = set(range(5)) # {0, 1, 2, 3, 4}
myset1.update(myset2) # myset1とmyset2の和でmyset1を更新
print(myset1) # {0, 1, 2, ……, 8, 9}
myset1 -= myset2 # myset1とmyset1の差でmyset1を更新
print(myset1) # {0, 2, 4, 6, 8}
myset1.intersection_update(myset3) # myset1とmyset3の積でmyset1を更新
print(myset1) # {0, 2, 4}
myset2 ^= myset3 # myset2とmyset3の対称差でmyset2を更新
print(myset2) # {0, 2, 4, 5, 7, 9}
myset1 = set() # 空の集合を作成
myset1 |= {1, 2} | {3, 4} | {5, 6} # 複数の集合で集合myset1を更新
print(myset1)
実行結果を以下に示す。
ここまで見てきた集合は「変更可能」つまり、要素を追加したり、削除したりといった操作が可能だった。その一方で、Pythonでは「frozenset」を利用することで、一度作成したら、その要素を変更できない集合を作成できる。
frozensetを作成するには、frozenset関数に集合や反復可能オブジェクトを渡す。
frozenset([iterable])
iterableの要素を基にfrozensetオブジェクトを作成する。
パラメーター | 説明 |
---|---|
iterable | frozensetオブジェクトの要素を含んだ集合や反復可能オブジェクト(省略可能)。省略時は空のfrozensetオブジェクトが作成される |
frozenset関数のパラメーター |
以下に例を示す。
myset = set(range(5))
myfrozenset = frozenset(myset)
print(myfrozenset)
myfrozenset.add(5)
以下に実行結果を示す。
この例では、frozensetオブジェクトを作成した後に、addメソッドで要素を追加しようとしているが、frozensetにはaddメソッドがないのでエラー(AttributeError例外)が発生している。
frozensetは変更不可能(イミュータブル)なので、本稿で紹介してきた操作の中で、要素を追加したり削除したりするものと(add/remove/discard/clear/popメソッド)、自身を更新するメソッドや演算子は利用できない。
プログラムの中では、起動時に一定の要素が決められ、その実行期間中はそれらが変更することがないデータの集まりもある。そうした場合には、frozensetオブジェクトでそれらを表現できる。また、通常の集合は変更可能なので、辞書のキーには使えないが、frozensetは変更不可能なので辞書のキーとして使える。
deep_and_net = frozenset({'deep insider', 'insider.net'})
deep__and_net_editors = {deep_and_net: ['isshiki', 'kawasaki']}
例えば、このコードではDeep InsiderとInsider.NETを「deep_and_net」というfrozensetにまとめて、その両方のフォーラムを担当する編集者として'isshiki'と'kawasaki'をアサインしているコードだ。
「Python入門」
Copyright© Digital Advantage Corp. All Rights Reserved.