今回はPythonにおける集合を扱うための型である「set型」をご紹介したいと思います。
この記事では
・set型とは
・set型の基本的な使い方
といった基本的な内容から
・list型からset型を作る方法
・set型で出来る様々な計算方法
・list型からset型を作る方法
など、より応用的な内容に関してもやさしく解説していきたいと思います。
※ この記事のコードはPython 3.7で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
set型とは
皆さんはset型を使用したことはありますか?
そもそもset型が何か知っていますか?
Pythonのset型とは、集合を扱うための型です。
もっとも普及しているリスト型のように、set型も同じく複数の値を格納できる型です。
しかし、リスト型との決定的な違いは
・重複した要素がない
・要素に順番がない
といった二点が挙げられます。
リスト型についての詳しい説明は、以下のリンクを参照してください。
set型の基本的な使い方
では早速、set型を使用してみましょう。
set型オブジェクトを作成するには、以下のようにコードを書きます。
myset1 = set([1,2,3]) myset2 = set([1,2,3,3,2,1]) print(myset1) print(myset2)
出力結果は以下の通りです。
{1, 2, 3} {1, 2, 3}
上のコードでは三つの整数を含むset型オブジェクトを二つ作成し、表示させてみました。
ちなみに、ご覧いただけるように二番目に作成したmyset2は重複した要素を含みます。
出力されるときは重複された要素は無視されているため、両方とも同じ内容が表示されました。
setに要素を追加する方法
set型オブジェクトに要素を追加するには、addメソッドを使います。
以下のサンプルコードをご覧ください。
myset = set([1,2,3]) myset.add(4) print(myset)
出力結果は以下の通りです。
{1, 2, 3, 4}
上のコードでは、既存のset型オブジェクトmysetに要素を追加してみました。
また、既にある要素を追加してもエラーは発生しませんが、重複している要素は無視されるので注意してください。
setから要素を削除する方法
set型オブジェクトから特定の要素を削除するには、removeメソッドを使います。
以下のサンプルコードをご覧ください。
myset = set([1,2,3]) myset.remove(3) print(myset)
出力結果は以下の通りです。
{1, 2}
上のコードでは、removeメソッドを使用し値4の要素を削除してみました。
実際、正常に3のみが削除されていることが確認できます。
しかし、存在しない要素を削除しようとするとエラーが発生するので、注意してください。
また、すべての要素を一気に削除するには、clearメソッドが便利です。
以下のサンプルコードをご覧ください。
myset.clear() print(myset)
出力結果は以下の通りです。
set()
ご覧いただけるように、出力結果は空のset型オブジェクトになりました。
set型で出来る計算方法
set型オブジェクトを扱うことができると、集合の計算が簡単に出来てしまいます。
集合の計算とは
・和集合
・積集合
・差集合
・排他的論理和集合
などのことです。
一見難しそうにみえますが、実際はとても直感的でわかりやすいものなので、ぜひ覚えておいてくださいね。
和集合(「|」とunionメソッド)
ではまずは、和集合の計算を行ってみましょう。
2つのset型オブジェクトの要素を全て持った新しいset型オブジェクトのことを、和集合といいます。
図で表すと、青く塗られた部分が和集合になります。
和集合を作るには以下のサンプルコードをご覧ください。
A = {1,2,3} B = {3,4,5} C = A | B print(C)
出力結果は以下の通りです。
{1, 2, 3, 4, 5}
上のコードでは、演算子「|」(パイプ)を使用しで集合の和を取りました。
ご覧いただけるように、setAの要素である1、2、3とsetBの要素である3、4、5のすべてがCに含まれています。
要素3は重複しているので、一度だけの登場となります。
また、演算子パイプの代わりにunionメソッドでも同じ和集合を作ることができます。
C = A.union(B) print(C)
出力結果は以下の通りです。
{1, 2, 3, 4, 5}
和集合ということで「+」演算子を使用できるのでは?と思うかもしれませんが、「+」演算子は残念ながら使えないので気をつけましょう。
積集合(「&」とintersectionメソッド)
では次に、積集合を作ってみましょう。
2つのset型オブジェクトの要素で、どちらの集合にも存在している要素のみを持った新しいset型オブジェクトのことを、積集合といいます。
図で表すと、青く塗られた部分が積集合になります。
積集合を作るには以下のサンプルコードをご覧ください。
A = {1,2,3} B = {3,4,5} C = A & B print(C)
出力結果は以下の通りです。
{3}
上のコードでは、演算子「&」(アンパサンド)を使用しで集合の積を取りました。
ご覧いただけるように、setAの要素である1、2、3とsetBの要素である3、4、5のうち、両方に含まれているのは要素3のみなので、setCには3のみが存在しています。
また、演算子アンパサンドの代わりにintersectionメソッドでも同じ和集合を作ることができます。
C = A.intersection(B) print(C)
出力結果は以下の通りです。
{3}
ご覧いただけるように、先ほどと結果は変わりません。
差集合(「-」とdifferenceメソッド)
次に差集合を作ってみましょう。
2つのset型オブジェクトA,Bの要素で、AからAとBの積集合を削除した要素のみを持った新しいset型オブジェクトを、差集合と呼びます。
図で表すと青く塗られた範囲になります。
差集合を作るには以下のサンプルコードをご覧ください。
A = {1,2,3} B = {3,4,5} C = A - B print(C)
出力結果は以下の通りです。
{1, 2}
上のコードでは、演算子「-」(マイナス)を使用しで集合の差を取りました。
ご覧いただけるように、setAの要素である1、2、3とsetBの要素である3、4、5のうち、両方に含まれているのは要素3をAから削除した、1、2のみがCに含まれています。
また、differenceメソッドでも同じ差集合を作ることができます。
C = A.difference(B) print(C)
出力結果は以下の通りです。
{1, 2}
ご覧いただけるように、結果は先ほどと同じとなりました。
排他的論理和集合(「^」とsymmetric_differenceメソッド)
では最後に、排他的論理和集合を作ってみましょう。
2つのset型オブジェクトA,Bの要素で、AとBで共通した要素以外を足し合わせた新しいset型オブジェクトを、排他的論理和集合と呼びます。
図で表すと青く塗られた部分になります。
排他的論理和集合を作るには以下のサンプルコードをご覧ください。
A = {1,2,3} B = {3,4,5} C = A ^ B print(C)
出力結果は以下の通りです。
{1, 2, 4, 5}
上のコードでは、演算子「^」(キャレット)を使用し排他的論理和を取りました。
ご覧いただけるように、setAの要素である1、2、3とsetBの要素である3、4、5のうち、両方に含まれているのは要素3をAとBの和集合から削除した、1、2、4、5のみがCに含まれています。
また、symmetric_differenceメソッドでも排他的論理和を作ることができます。
C = A.symmetric_difference(B) print(C)
出力結果は以下の通りです。
{1, 2, 4, 5}
同じ結果を得る事が出来ました。
set型の応用的な使い方
では、set型の基本的な使い方を学んだところで、応用編にも少し触れてみましょう。
list型からset型を作る方法
既存のリスト型オブジェクトからset型オブジェクトを作成することも出来ます。
set関数の引数としてリストを指定するだけで、簡単に作成できてしまうのです。
以下のサンプルコードをご覧ください。
mylist = [11, 1, 3, 5, 3, 6, 7, 8, 9, 23, 23, 5] myset = set(mylist) print(myset)
出力結果は以下の通りです。
{1, 3, 5, 6, 7, 8, 9, 11, 23}
上のコードでは、整数を含むリスト型オブジェクトを元にset型オブジェクトを作成しました。
リストには重複した要素がありますが、set型にはありません。
また、要素たちの順番もリスト型オブジェクトとは違うのがわかります。
まとめ
今回はPythonにおける基本的なset型オブジェクトの使い方をご紹介しました。
リスト型オブジェクトとはまた違う利便性があるので、使えると便利な型であること間違いありません。
皆さんもぜひset型オブジェクトの扱い方を覚えて、いろいろな作業をマスターしてくださいね。