Python

【Python】setの使い方

setは重複する要素を持たず、順序もない要素の集まりです。setオブジェクトは和、積、差、対象差といった数学的な演算もサポートしています。{} もしくは set()関数を使うことで生成することができます。ただし空集合を生成するためにはset()関数を使う必要があります。{}だと空の辞書が生成されてしまう

setを生成する

setの生成には{}で囲って要素を「,」で準備します。ただし空集合を作りたい場合はこの方法では作ることができません。

# setの生成
plSet = {'python', 'java', 'ruby', 'c', 'php'}
print(plSet)

出力結果

{'python', 'java', 'c', 'php', 'ruby'}

他にsetを作る方法はset()関数を使うことで生成できます。空集合を作りたい場合はこちらである必要があります。set()関数に文字列を入れると一文字ずつに分割されて集合になります。

# set()関数を使ってsetオブジェクトを生成してみる
a = set('アブラカタブラ')
b = set('カタメのラーメン')
print(a)
print(b)

出力結果

# a
{'ブ', 'ラ', 'カ', 'タ', 'ア'}

# b
{'ン', 'ラ', 'の', 'メ', 'カ', 'ー', 'タ'}

空集合を作る場合はこんな感じで。

c = set()
print(c)

出力結果

set()

 [temp id=2]

要素が含まれているか判定

集合に要素が含まれているか判定するには「'検索したいオブジェクト' in setName」で検索できます。

plSet = {'python', 'java', 'ruby', 'c', 'php'}

# 要素が含まれているか判定
print('python' in plSet)
print('go' in plSet)

出力結果

True
False

要素数を調べる

setの要素数を調べるにはlen()関数を使います。

plSet = {'python', 'java', 'ruby', 'c', 'php'}

# len()で要素数を調べることができる
print(len(plSet))

出力結果

5

要素の追加

要素の追加はリストと同じくaddメソッドを使います。

plSet = {'python', 'java', 'ruby', 'c', 'php'}

# add()で要素を追加することができる
plSet.add('java script')
print(plSet)

出力結果

順序が関係ないので途中で追加した「java script」が4番目に入っています。

{'python', 'c', 'ruby', 'java script', 'java', 'php'}

[temp id=2]

要素の削除

要素の削除を行う関数はdiscard()関数とremove()関数の二種類が存在します。まずはdiscard関数を使ってみます。discard関数は指定した要素を削除します。指定した要素が存在しない場合には何もしません。

plSet = {'python', 'java', 'ruby', 'java script', 'c', 'php'}

# discard()で指定した要素を削除する
# 指定した要素が存在しない場合は何もしない
plSet.discard('java script')
print(plSet)
plSet.discard('c++')
print(plSet)

出力結果

{'python', 'c', 'ruby', 'java', 'php'}
{'python', 'c', 'ruby', 'java', 'php'}

remove関数も指定した要素を削除するという点ではdiscard関数と同じですが、指定した要素がない場合にはKeyErrorが送出されます。

# remove()ではしたいした要素を削除する
# だけど指定した要素がなかった時にKeyErrorが送出される
plSet.remove('java')
print(plSet)
print()
# 以下KeyErrorが送出される
# plSet.remove('java')

出力結果

{'python', 'c', 'ruby', 'php'}

[temp id=2]

他にも要素を削除するという点ではpop関数とclear関数が存在します。pop関数はどれか一つの値を削除した上でその値が返ってきます。

plSet = {'python', 'c', 'ruby', 'php'}

# popはどれか一つの値を削除した上でその値を返す
print(plSet.pop())
print(plSet)

出力結果

python
{'c', 'ruby', 'php'}

clearメソッドです。これは全ての要素を削除し空集合になります。

# clearによって全ての値を削除する
plSet.clear()
print(plSet)

出力結果

set()

演算

はじめに述べたとおりsetオブジェクトは和、積、差、対象差といった数学的な演算もサポートしています。これを順番に見ていきます。

「-」もしくはdifference

集合aには含まれていて集合bには含まれていないものを調べる時には「-」もしくはdifferenceを使います。

# set()関数を使ってsetオブジェクトを生成してみる
a = set('アブラカタブラ')
b = set('カタメのラーメン')
print(a)
print(b)
print()

# aには含まれて入れbには含まれない
print(a-b)
print(a.difference(b))
print()

出力結果

{'ア', 'タ', 'カ', 'ブ', 'ラ'}
{'の', 'タ', 'メ', 'カ', 'ン', 'ー', 'ラ'}

{'ブ', 'ア'}
{'ブ', 'ア'}

 [temp id=2]

「|」もしくはunion

集合aもしくは集合bのどちらか一方に含まれている要素の集合を求めるときは|もしくはunionを使うことで求めることができます。

# set()関数を使ってsetオブジェクトを生成してみる
a = set('アブラカタブラ')
b = set('カタメのラーメン')

# aもしくはbに含まれる
print(a|b)
print(a.union(b))

出力結果

{'の', 'ア', 'タ', 'メ', 'カ', 'ン', 'ブ', 'ー', 'ラ'}
{'の', 'ア', 'タ', 'メ', 'カ', 'ン', 'ブ', 'ー', 'ラ'}

「&」もしくはintersection

集合aと集合bどちらにも含まれている要素を持つ集合を求めるときは「&」もしくはintersectionを使うことで求めることができます。

# set()関数を使ってsetオブジェクトを生成してみる
a = set('アブラカタブラ')
b = set('カタメのラーメン')

# aとb両方に含まれる
print(a&b)
print(a.intersection(b))

出力結果

{'カ', 'タ', 'ラ'}
{'カ', 'タ', 'ラ'}

[temp id=2]

「^」もしくはsymmetric_difference

集合aもしくは集合bに含まれていてかつどちらか一方にしか存在しない要素の集合を求める際には「^」もしくはsymmetric_differenceを使うことで求めることができます。つまりunionで求めた集合からintersectionで求めた集合を引くことで求められる集合がsymmetric_differenceになります。

# set()関数を使ってsetオブジェクトを生成してみる
a = set('アブラカタブラ')
b = set('カタメのラーメン')

# aかbに含まれるが、両方に含まれるものは除外
print(a^b)
print(a.symmetric_difference(b))

以上になります。

-Python