連載
» 2019年06月25日 05時00分 公開

Python入門:[Python入門]集合 (4/4)

[かわさきしんじ,Deep Insider編集部]
前のページへ 1|2|3|4       

集合を更新する:updateメソッド/difference_updateメソッド/intersection_updateメソッド/symmetric_difference_updateメソッド

 ここまでに見てきた、集合の和/差/積/対称差を求める操作はいずれも、複数の集合(メソッドを使った場合は反復オブジェクトのこともある)から新しい集合を作成するものだった。だが、和/差/積/対称差を求めて、それらで元の集合を更新することも可能だ。分かりやすくいうと「集合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)

自身を更新するメソッドや演算子の使用例

 実行結果を以下に示す。

実行結果 実行結果

frozenset

 ここまで見てきた集合は「変更可能」つまり、要素を追加したり、削除したりといった操作が可能だった。その一方で、Pythonでは「frozenset」を利用することで、一度作成したら、その要素を変更できない集合を作成できる。

 frozensetを作成するには、frozenset関数に集合や反復可能オブジェクトを渡す。

frozenset関数

frozenset([iterable])


 iterableの要素を基にfrozensetオブジェクトを作成する。

パラメーター 説明
iterable frozensetオブジェクトの要素を含んだ集合や反復可能オブジェクト(省略可能)。省略時は空のfrozensetオブジェクトが作成される
frozenset関数のパラメーター


 以下に例を示す。

myset = set(range(5))
myfrozenset = frozenset(myset)

print(myfrozenset)
myfrozenset.add(5)

frozensetオブジェクトの作成

 以下に実行結果を示す。

実行結果 実行結果

 この例では、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']}

frozensetオブジェクトを辞書のキーとする例

 例えば、このコードではDeep InsiderとInsider.NETを「deep_and_net」というfrozensetにまとめて、その両方のフォーラムを担当する編集者として'isshiki'と'kawasaki'をアサインしているコードだ。

まとめ

今回のまとめ:集合

  • 集合は重複のない要素の集まりで、各要素には順序がない
  • 集合は「{}」内にその要素をカンマ区切りで並べて作成する
  • set関数や内包表記によって集合を作成することも可能
  • 集合に要素を追加するにはaddメソッドを使用する
  • 集合から要素を削除するには、removeメソッド/discardメソッド/popメソッドを使用する
  • removeメソッドは指定した要素が集合にないときには例外を発生し、discardメソッドは例外を発生しない
  • popメソッドは集合にある任意の要素を削除して、その要素を戻り値とする
  • ある集合が別の集合の部分集合かどうかを調べるにはissubsetメソッド、<=演算子、<演算子を使用する
  • ある集合が別の集合の上位集合かどうかを調べるにはissupersetメソッド、>=演算子、>演算子を使用する
  • 2つの集合の和、差、積、対称差を求められる
  • 和を求めるには、unionメソッド、|演算子を使用する
  • 求めた和で元の集合を更新するには、updateメソッド、|=演算子を使用する
  • 差を求めるには、differenceメソッド、-演算子を使用する
  • 求めた差で元の集合を更新するには、difference_updateメソッド、-=演算子を使用する
  • 積を求めるには、intersectionメソッド、&演算子を使用する
  • 求めた積で元の集合を更新するには、intersection_updateメソッド、&=演算子を使用する
  • 対称差を求めるには、symmetric_differenceメソッド、^演算子を使用する
  • 求めた対称差で元の集合を更新するには、symmetric_difference_updateメソッド、^=演算子を使用する
  • 通常の辞書は要素の変更が可能だが、frozenset関数により要素を変更できない集合(frozensetオブジェクト)を作成できる

「Python入門」のインデックス

Python入門

前のページへ 1|2|3|4       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。