Pythonのセット型まとめ

スポンサーリンク
Python基礎
スポンサーリンク

Pythonのセット型についてまとめてみました。1枚に使い方の要点をまとめたPDFもダウンロードできます。要素の管理がしやすいセット型を使いこなしていきましょう。

セット型について

最初にセット型とはどんなものか特徴をあげます。
セット型の特徴は、
・リストと同じように複数の値を持つシーケンスのデータの種類
・中の要素が重複しない
・順序やインデックスがない
・集合演算が可能

セット型はfor文などで値を取り出すことができる「イテラブル」なオブジェクトです。

セット型まとめ

セット型の要点を1枚にまとめました。(PDF版ダウンロード

セット型の詳しい使い方は次に詳細に説明していきます。

セットの作り方

波括弧で囲む

a_set = {2, 4, 5}

リストからセットを作る

リストからセットに変換するとき、重複しているデータは1つになります。

new_list = [3, 5, 9, 5]
b_set= set(new_list)
print(b_set)
{9, 3, 5}

空のセットを作る

c_set = set()

セットへの要素の追加

addで要素を追加できる。

a_set = {2, 4, 5}
a_set.add(8)
print(a_set)
{8, 2, 4, 5}

複数の要素を追加するときは、updateを使う。

a_set = {2, 4, 5}
a_set.update({8, 9, 12})
print(a_set)
{2, 4, 5, 8, 9, 12}

セットから要素を削除する

指定した要素を削除

removeで指定した要素を削除できる。その要素が存在しない場合は、Keyエラーを返す。

a_set = {2, 4, 5}
a_set.remove(4)
print(a_set)
{2, 5}

discardでも指定した要素を削除できる。その要素が存在しない場合は、何も起きない。

a_set = {2, 4, 5}
a_set.discard(4)
print(a_set)
{2, 5}

1つの要素を削除

popで任意の要素が削除されます。削除された値を返します。削除される要素についてはsetの内部に持っているテーブル的なものから順に削除しているような挙動を示し、ランダムな削除な要素を削除されるわけではないようです。(同じ手順を踏んでpopを使うと、同じ値が削除されるようです。)

a_set = {2, 4, 5}
num = a_set.pop()
print(a_set)
print(num)
{4, 5}
2

要素を全削除

a_set = {2, 4, 5}
a_set.clear()
print(a_set)
set()

セットの要素数

a_set = {2, 4, 5, 8}
print(len(a_set))
4

セットに含まれている/含まれていないことを確認

is inとis not inでセット内に要素が含まれているか、確認できます。

a_set = {2, 4, 5, 8}
# セットに4が含まているか?
print(4 in a_set)
print(6 not in a_set)
print(9 in a_set)
True
True
False

セット間の包含を確認

不等号でセット間の包含関係(部分集合等)を確認できます。

a_set = {1, 2, 3, 4, 5}
b_set = {1, 2, 3}
c_set = {1, 2, 3}

print(a_set > b_set) # True
print(b_set == c_set) # True
print(a_set != b_set) # True
print(b_set < c_set) # False
print(b_set<= c_set) # True

共通の要素がないことを確認

共通の要素がないときはTrueを返します。

a_set = {1, 2, 3, 4, 5}
b_set = {1, 2, 3}
c_set = {4, 5, 6}
print(a_set.isdisjoint(b_set)) # False
print(b_set.isdisjoint(c_set)) # True

集合演算

集合の特徴の一つである集合演算です。それぞれ集合を返す演算子と集合そのものを書き換えるupdateメソッドが準備されています。

和集合

以下の3つの操作はいずれも集合a_setとb_setの和集合をa_setに代入する結果になります。

a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set = a_set.union(b_set)
print(a_set)
{1, 2, 3, 4, 5, 6}
a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set = a_set | b_set
print(a_set)
{1, 2, 3, 4, 5, 6}
a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set.update(b_set)
print(a_set)
{1, 2, 3, 4, 5, 6}

積集合

a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set = a_set.intersection(b_set)
print(a_set)
{3, 4}
a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set = a_set & b_set
print(a_set)
{3, 4}
a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set.intersection_update(b_set)
print(a_set)
{3, 4}

差集合

a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set = a_set.difference(b_set)
print(a_set)
{1, 2}
a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set = a_set - b_set
print(a_set)
{1, 2}
a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set.difference_update(b_set)
print(a_set)
{1, 2}

対称差集合

a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set = a_set.symmetric_difference(b_set)
print(a_set)
{1, 2, 5, 6}
a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set = a_set ^ b_set
print(a_set)
{1, 2, 5, 6}
a_set = {1, 2, 3, 4}
b_set = {3, 4, 5, 6}

a_set.symmetric_difference_update(b_set)
print(a_set)
{1, 2, 5, 6}

更新不可のセット(frozenset)

セット型の派生型として、frozenset型があります。frozenset型は更新できない以外はセット型と同じように使えます。

frozenset型の作成

f_set = frozenset([1,2,3,4,5])
print(f_set)
frozenset({1, 2, 3, 4, 5})

集合の演算はセット型と同様

集合演算も同じように使えますが、frozenset型をベースに集合演算すると、結果もfrozenset型を返します。

a_set = {1, 2, 3, 4}
f_set = frozenset([3, 4, 5, 6])

print(a_set.union(f_set))
print(f_set.union(a_set))
{1, 2, 3, 4, 5, 6}
frozenset({1, 2, 3, 4, 5, 6})

セットの複製

copyで浅いコピーを作成します。参照コピーでは、元のセットを更新すると、コピー先も更新されますが、copyでの複製では、別のセットとして扱われます。リスト型と同様ですね。ただし、セット型ではdeepcopyは実装されていないようです。セット型で多次元を取り扱うことはあまりないと思いますが。

a_set = {1, 2, 3, 4}
b_set = a_set # 参照コピー
c_set = a_set.copy() # 浅いコピー

print(a_set)

a_set.update({5})

print(a_set)
print(b_set)
print(c_set)

コメント