Python学習メモ - その7
まえがき
最近、Python を勉強し始めたので、その学習メモです。
今回はセット(Set)についてです。
セット(Set)
セットはタプルやリストと同様、複数のデータをまとめて扱う場合に使用しますが、ユニーク(一意)な値を格納する順序なしのコレクションです。
例えば、複数のデータから重複したデータを除去したい場合や、数学集合に関する計算を行う場合に使用します。
セット定義 & アクセス
セットは複数のデータをカンマ( , )で区切り、前後に中かっこ「{ }」をつけることでセットとして認識されます。
セットには順序が記憶されないため、タプルやリストのようなインデックスによるアクセス(値取得・変更)はできません。
set_values = {1, 2, 3, 4} print(set_values) set_values = {1, 2, 3, 2, 4, 1} print(set_values) # print(set_values[0]) # 実行エラー # set_values[2] = 10 # 実行エラー
実行結果
{1, 2, 3, 4} {1, 2, 3, 4}
複数型
一意の値であれば、異なる型のデータを格納することもできます。
set_values = {1, 3.14, "set"} print(set_values) set_values = {1, 3.14, 1, "set", 3.14} print(set_values)
実行結果
{1, 3.14, 'set'} {1, 3.14, 'set'}
空セット
空のセットを定義する場合は、set()関数を使用します。
set_values = set() print(set_values)
実行結果
set()
値の追加
値の追加はaddメソッドを使用します。
set_values = set() set_values.add(1) set_values.add(2) set_values.add(3) set_values.add(2) set_values.add(4) set_values.add(1) print(set_values)
実行結果
{1, 2, 3, 4}
値の削除
値の削除はremoveメソッドまたはdiscardメソッドを使用します。
removeメソッドは値が見つからなかった場合に、エラーが発生します。
discardメソッドは値が見つからなかった場合でもエラーが発生しません。
set_values = {1, 2, 3, 4, 5} set_values.remove(3) # set_values.remove(6) # Key Error
実行結果
{1, 2, 4, 5}
set_values = {1, 2, 3, 4, 5} set_values.discard(3) set_values.discard(6) print(set_values)
実行結果
{1, 2, 4, 5}
値の取り出し
セットから順番に値を取得する場合は、popメソッドを使用します。 セットがからの場合、エラーが発生します。
set_values = {1, 2, 3, 4, 5} print(set_values.pop()) print(set_values.pop()) print(set_values.pop()) print(set_values.pop()) print(set_values.pop()) # print(set_values.pop()) # Error
実行結果
1 2 3 4 5
クリア
セットをクリアする場合には、clearメソッドを使用します。
set_values = {1, 2, 3, 4, 5} print(set_values) set_values.clear() print(set_values)
実行結果
{1, 2, 3, 4, 5} set()
全要素数取得
セット全体の要素数を取得したい場合はlen関数を使用します。
set_values = {1, 2, 3, 4, 5} print(len(set_values))
実行結果
5
存在確認
セット内に特定の要素が存在しているかを確認する場合には、in演算子を使用します。
set_values = {1, 2, 3, 4, 5} print(2 in set_values)
実行結果
True
逆に、セットの中に特定の値が含まれていないことを確認したい場合は、not in 演算子を使用します。
set_values = {1, 2, 3, 4, 5} print(6 in set_values)
実行結果
True
コピー
セットの複製を作成したい場合は、copyメソッドを使用します。
set_values1 = {1, 2, 3, 4, 5} set_values2 = set_values1 set_values3 = set_values1.copy() print(set_values1) print(set_values2) print(set_values3) print() set_values1.add(6) set_values2.add(7) print(set_values1) print(set_values2) print(set_values3)
実行結果
{1, 2, 3, 4, 5} {1, 2, 3, 4, 5} {1, 2, 3, 4, 5} {1, 2, 3, 4, 5, 6, 7} {1, 2, 3, 4, 5, 6, 7} {1, 2, 3, 4, 5}
互いに素
2つのセットが互いに素である(set1とset2が共通の要素を持たない)ことを確認する場合は、isdisjointメソッドを使用します。
set1 = {1, 3, 5, 7} set2 = {2, 4, 6, 8} print(set1.isdisjoint(set2))
実行結果
True
部分集合
2つのセットが部分集合の関係である(set1のすべての要素がset2に含まれる(set1とset2が同じでも良い))ことを確認する場合は、issubsetメソッドまたは <= 演算子を使用します。
set1 = {1, 3, 5} set2 = {1, 2, 3, 4, 5} print(set1.issubset(set2)) print(set1 <= set2) print() set2 = {1, 3, 5} print(set1.issubset(set2)) print(set1 <= set2)
実行結果
True True True True
真部分集合
2つのセットが真部分集合の関係である(set1のすべての要素がset2に含まれる かつ set1とset2は同じではない)ことを確認する場合は、< 演算子を使用します。
これは、set1.issubset(set2) and set1 != set2
と等価です。
set1 = {1, 3, 5} set2 = {1, 2, 3, 4, 5} print(set1.issubset(set2) and set1 != set2) print(set1 < set2) print() set2 = {1, 3, 5} print(set1.issubset(set2) and set1 != set2) print(set1 < set2)
実行結果
True True False False
上位集合
2つのセットが上位集合の関係である(set2のすべての集合がset1に含まれる(set1とset2が同じでも良い))ことを確認する場合は、issupersetメソッドまたは >= 演算子を使用します。
set1 = {1, 2, 3, 4, 5} set2 = {1, 3, 5} print(set1.issuperset(set2)) print(set1 >= set2) print() set2 = {1, 2, 3, 4, 5} print(set1.issuperset(set2)) print(set1 >= set2)
実行結果
True True True True
真上位集合
2つのセットが真上位集合の関係である(set2のすべての要素がset1に含まれる かつ set1とset2は同じではない)ことを確認する場合は、> 演算子を使用します。
これは、set1.issuperset(set2) and set1 != set2
と等価です。
set1 = {1, 2, 3, 4, 5} set2 = {1, 3, 5} print(set1.issuperset(set2) and set1 != set2) print(set1 > set2) print() set2 = {1, 2, 3, 4, 5} print(set1.issuperset(set2) and set1 != set2) print(set1 > set2)
実行結果
True True False False
和集合の作成
set1とset2の要素からなる新しい集合(和集合)を作成する場合、unionメソッドまたは | 演算子を使用します。
set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set3 = set1.union(set2) set4 = set1 | set2 print(set3) print(set4)
実行結果
{1, 2, 3, 4, 5} {1, 2, 3, 4, 5}
積集合の作成
set1とset2の共通要素を持つ新しい集合(積集合)を作成する場合、intersectionメソッドまたは & 演算子を使用します。
set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set3 = set1.intersection(set2) set4 = set1 & set2 print(set3) print(set4)
実行結果
{1, 3} {1, 3}
差集合の作成
set1に含まれset2に含まれない要素をもつ新しい集合(差集合)を作成する場合、differenceメソッドまたは - 演算子を使用します。
set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set3 = set1.difference(set2) set4 = set1 - set2 print(set3) print(set4)
実行結果
{2, 4} {2, 4}
排他集合の作成
set1とset2のいずれか一方にだけ含まれる要素をもつ新しい集合(排他集合)を作成する場合、symmetric_differenceメソッドまたは ^ 演算子を使用します。
set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set3 = set1.symmetric_difference(set2) set4 = set1 ^ set2 print(set3) print(set4)
実行結果
{2, 4, 5} {2, 4, 5}
和更新
set1にset2の要素を追加し、set1を更新(和更新)する場合には、updateメソッドまたは |= 演算子を使用します。
set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set1.update(set2) print(set1) set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set1 |= set2 print(set1)
実行結果
{1, 2, 3, 4, 5} {1, 2, 3, 4, 5}
積更新
set1とset2に共通する要素を残し、set1を更新(積更新)する場合には、intersection_updateメソッドまたは、 &= 演算子を使用します。
set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set1.intersection_update(set2) print(set1) set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set1 &= set2 print(set1)
実行結果
{1, 3} {1, 3}
差更新
set1からset2に含まれる要素を取り除き、set1を更新(差更新)する場合には、difference_updateメソッドまたは -= 演算子を使用します。
set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set1.difference_update(set2) print(set1) set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set1 -= set2 print(set1)
実行結果
{2, 4} {2, 4}
排他更新
set1とset2のどちらかのみに含まれる要素によって、set1を更新(排他更新)する場合には、symmetric_difference_updateメソッドまたは ^= 演算子を使用します。
set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set1.symmetric_difference_update(set2) print(set1) set1 = {1, 2, 3, 4} set2 = {1, 3, 5} set1 ^= set2 print(set1)
実行結果
{2, 4, 5} {2, 4, 5}
frozenset
frozensetは追加・削除・更新などの操作が不可能(イミュータブル)なセットです。
関数の戻り値として使用する場合など、要素を変更されたくない場合などにfrozensetを使用します。
fset1 = frozenset() print(fset1) fset2 = frozenset({1, 2, 3, 4, 5, 3, 2, 4}) print(fset2) # fset2.add(1) # 実行エラー
実行結果
frozenset() frozenset({1, 2, 3, 4, 5})
参考文献
Python 公式リファレンス
https://docs.python.org/ja/3.7/index.html
Python-izm
ゲームを作りながら楽しく学べるPythonプログラミング
ゲームを作りながら楽しく学べるPythonプログラミング (Future Coders(NextPublishing))
- 作者: 田中賢一郎
- 出版社/メーカー: インプレスR&D
- 発売日: 2017/03/24
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
エキスパートPythonプログラミング
エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)
- 作者: Michal Jaworski,TarekZiade,稲田直哉,芝田将,渋川よしき,清水川貴之,森本哲也
- 出版社/メーカー: ドワンゴ
- 発売日: 2018/02/26
- メディア: Kindle版
- この商品を含むブログを見る