本記事では、pythonで用いられるデータ型の一つである集合(set型)についてその使い方や演算方法、メソッドを紹介していこうと思います。
そもそも「集合って何?」というところから始まり、その演算方法やメソッドの説明などの実践的な部分まで説明しているのでぜひ最後まで見ていってください。
ちなみに、本ブログでは初心者の方でも理解できるように丁寧に説明しているので、全くの初心者という方も安心してください。
また、pythonをまだインストールしていないといった方は以下の記事を参考にしてインストールしてみましょう。
この記事でわかること
- 集合について
- 集合の演算方法
- 集合のメソッド
目次
集合について
まず初めに、集合とはどのようなもののことを指すのかについてご説明させていただこうと思います。
また、集合に非常に似通っているデータ型として、リスト、タプル、辞書というものがあるのですが、もしそれらについてよく知らないという方は、以下の記事の方を先に見ることをおすすめします。
集合とは?
pythonの世界での集合とは、複数のデータをまとめたものです。
データというのは、例えばint型やfloat型の数値であったり、string型の文字列であったりなんでもOKです。
ここまではリストと共通なのですが、実は集合型のデータは重複する値を許しません。
一体どういうことなのかをコードを用いて説明していきたいと思います。
<input>
a = {1, 2, 2, 2, 3, 4, 4}
print(a, type(a))
<output>
{1, 2, 3, 4} <class 'set'>
まず、集合の宣言方法なのですが、辞書の時と同様に『{}』で囲むことによって宣言します。
その後、集合の中身を出力しているのですが、見て分かる通り重複しているデータが消えていると思います。
今回のデータですと2と4が重複してますね。
このような形で、宣言する際に同じデータを複数含んでいてもエラーにならないのですが、実際に中身を見てみると重複するデータは消えてしまうので覚えておきましょう。
また、集合はよく『set型』と呼ばれます。
合わせて覚えておきましょう。
他の型のデータを集合に変換
実は、似たようなデータ型である『list』『tuple』『dictionary』のデータは集合に変換することが出来ます。
<input>
list = [0, 1, 2, 2, 2, 3, 4, 4]
tuple = (0, 1, 2, 2, 2, 3, 4, 4)
dictionary = {"x": 10, "y": 20}
set_list = set(list)
set_tuple = set(tuple)
set_dictionary = set(dictionary)
print(set_list, type(set_list))
print(set_tuple, type(set_tuple))
print(set_dictionary, type(set_dictionary))
<output>
{0, 1, 2, 3, 4} <class 'set'>
{0, 1, 2, 3, 4} <class 'set'>
{'x', 'y'} <class 'set'>
『set_list』、『set_tuple』、『set_dictionary』がしっかりとset型になっているのが見て取れると思います。
ちなみに、辞書型は少し他のデータ型と形が異なるので、set型に変換するとkeyだけが取り出されるような感じになります。
変更不可能な集合の生成
集合は基本的には、要素の変更・追加・削除を行えるのですが、実は要素の変更・追加・削除を行えないような集合を作成することも可能です。
<input>
list = [0, 1, 2, 2, 2, 3, 4, 4]
set_list = frozenset(list)
print(set_list, type(set_list))
<output>
frozenset({0, 1, 2, 3, 4}) <class 'frozenset'>
後ほど、集合への要素追加方法をご紹介するので、その時に本当に要素の変更が行えないかどうかを試してほしいんですが、上記コードのように『frozenset』を用いると、要素の変更不可能な『frozenset型』の集合が生成されます。
リストやタプルの場合は、要素変更の可否が決まっていたのですが、集合の場合はどちらも扱えるので覚えておきましょう。
集合の演算
pythonにおける集合では、数学の世界の集合と同様に集合に対する演算を行うことが出来ます。
高校生の頃に『かつ』とか『または』とかを使って集合の要素を抜き出したのを覚えているでしょうか。
pythonでも同じようなことが行えるので、その具体的な操作方法を以下で詳しく確認していきたいと思います。
ちなみに、もちろん数学での集合を覚えていなくても全く問題なく理解できると思うので心配しなくて大丈夫です。
差集合
<input>
a = {1, 2, 2, 4}
b = {1, 3, 4, 8}
print(a - b)
<output>
{2}
差集合とは、集合同士の引き算の答えのことです。
よく、引き算の答えのことを差と言いますが、それの集合版といった感じですね。
集合同士の引き算では『引かれる側にあって引く側にない要素』が答えとなります。
今回は、aからbを引いているのでaが引かれる側、bが引く側ですよね。
なので差集合は、aにあるけれどbにはない2のみを要素に持つ『{2}』ということになります。
和集合
<input>
a = {1, 2, 2, 4}
b = {1, 3, 4, 8}
print(a | b)
<output>
{1, 2, 3, 4, 8}
和集合とは、集合同士の足し算の答えのことで、数学の世界でいうところの『または』にあたります。
なので、『少なくともどちらか一方の集合に含まれている要素』が答えになります。
今回のコードでは、aには(1,2,4)、bには(1,3,4,8)といった要素が含まれているので、和集合の答えは(1,2,3,4,8)を要素に持つ集合といった形になりますね。
ここで、和集合を求める際に『+』を使ってしまいがちなんですが、実は『+』を使うとエラーが出てしまい正しく処理が行えなくなってしまいます。
和集合を求めるときは必ず『または』という意味を持つ『|』を使用しましょう。
積集合
<input>
a = {1, 2, 2, 4}
b = {1, 3, 4, 8}
print(a & b)
<output>
{1, 4}
積集合とは、集合同士の掛け算の答えのことで、数学の世界でいうところの『かつ』にあたります。
なので、『どちらの集合にも含まれている要素』が答えになります。
今回のコードでは、aには(1,2,4)、bには(1,3,4,8)といった要素が含まれているので、積集合の答えは(1,4)を要素に持つ集合といった形になりますね。
ここで、積集合を求める際に『*』を使ってしまいがちなんですが、実は『*』を使うとエラーが出てしまい正しく処理が行えなくなってしまいます。
積集合を求めるときは必ず『かつ』という意味を持つ『&』を使用しましょう。
排他的論理和
<input>
a = {1, 2, 2, 4}
b = {1, 3, 4, 8}
print(a ^ b)
<output>
{2, 3, 8}
排他的論理和では、『どちらか一方にのみ含まれている要素』が答えになります。
つまり、『和集合 - 積集合』をすれば求められるというわけです。
今回のコードでは、『和集合(1,2,3,4,8) - 積集合(1,4)』をすればよいので答えとなる集合の要素は(2,3,8)となります。
集合の様々なメソッド
ここからは、以下の順番で集合のメソッドを一部紹介していこうと思います。
- add:要素を追加する
- remove:要素を削除する
- clear:集合を空にする
add:要素を追加する
<input>
set = {1, 2, 3, 4, 5}
set.add(6)
print(set)
<output>
{1, 2, 3, 4, 5, 6}
addは、集合に要素を追加するためのメソッドです。
追加したい要素を()の中に入れることで追加することが出来ます。
remove:要素を削除する
<input>
set = {1, 2, 3, 4, 5}
set.remove(5)
print(set)
<output>
{1, 2, 3, 4}
removeは、集合の要素を削除するためのメソッドです。
削除したい要素を()の中に入れることで削除することが出来ます。
clear:集合を空にする
<input>
set = {1, 2, 3, 4, 5}
set.clear()
print(set)
<output>
set()
clearは、集合の要素をすべて削除して集合を空にするためのメソッドです。
まとめ
今回は、集合についてその使い方からメソッドまで紹介してきましたがいかがだったでしょうか。
集合は、複数の要素を扱うデータ型の中でも重複する値を削除するといった特徴があります。
うまく使いこなして皆さんも一人前のプログラマーになりましょう。