この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。 hirocom777.hatenadiary.org 前回までで、リストについて学びました。学ぶことが結構ありますね!!
今回は集合について学んでいきたいと思います。
集合とは
集合とは、Pythonが標準でサポートしているオブジェクトの1つです。タプルは複数の値をまとめて管理できます。以下のように記述します。
{値1, 値2, …}
それぞれの値はイミュータブルなデータ型のオブジェクトをセットできます。また、集合の中の要素には重複した値を設定できません。ここがリストやタプルと違う点です。重複した値を設定しようとすると、その値は無視されてしまいます。そして、集合内の順番は保証されません。
s_1 = {1,2,3,1} print(s_1) # {1, 2, 3}を返す(順番は保証されない)
また、集合はシーケンスではありません。インデックスを使って参照することはできません。スライスもできません。
集合はイテラブルです。for文を使って要素を取り出せます。
for char in {'A','B','C','D'}: print(char, end=' ') # A B C D と表示する(順番は保証されない)
ただし、取り出される順番は保証されません。
要素の有無の確認は、in演算子、not in演算子を使います。
print('A' in {'A','B','C'}) # Trueを返す print('E' in {'A','B','C'}) # Falseを返す print('A' not in {'A','B','C'}) # Falseを返す print('E' not in {'A','B','C'}) # Trueを返す
集合どうしの連結はできません。list関数でリスト型に型変換して結合した後に、set関数で集合型に型変換しなおす必要があります。
s_1 = {'A','B'} s_2 = {'C','D'} print(set(list(s_1)+list(s_2))) # {'A', 'B', 'D', 'C'}を返す(順番は保証されない) print(s_1 + s_2) # エラーとなる
集合の修正
集合に値を追加するにはaddメソッドを使用します。
s_1 = {'A','B','C'} s_1.add('D') print(s_1) # {'C', 'A', 'B', 'D'}を返す(順番は保証されない)
集合にはappend、insertなどのメソッドがありません。順番が保証されないので、最後に追加、場所を指定して挿入などの修正はできません。
また、集合ではインデックスを使えないのでインデックスを指定した値の削除はできません。removeメソッドを使って、値を指定して削除します。
s_1 = {'A','B','C','D'} s_1.remove('C') print(s_1) # {'A', 'B', 'D'}を返す(順番は保証されない)
集合の計算
集合どうしで集合の計算ができます。以下の集合があったとします。
s_1 = {'A','B','C'} s_2 = {'C','D','E'}
- 和集合
2つの集合の要素をすべて持った集合を返します。
print(s_1 | s_2) # {'B', 'A', 'D', 'E', 'C'}を返す(順番は保証されない)
unionメソッドでも同じ結果を取得できます。
print(s_1.union(s_2))
- 積集合 2つの集合ともに持っている要素を持った集合を返します。
print(s_1 & s_2) # {'C'}を返す(順番は保証されない)
intersectionメソッドでも同じ結果を取得できます。
print(s_1.intersection(s_2))
- 差集合 1つ目の集合から2つ目の集合の要素を削除した集合を返します。
print(s_1 - s_2) # {'B', 'A'}を返す(順番は保証されない)
differenceメソッドでも同じ結果を取得できます。
print(s_1.difference(s_2))
- 排他的論理和集合 2つの集合の要素のうち、どちらか片方が持っている要素を持った集合を返します。
print(s_1 ^ s_2) # {'A', 'B', 'D', 'E'}を返す(順番は保証されない)
symmetric_differenceメソッドでも同じ結果を取得できます。
print(s_1.symmetric_difference(s_2))
集合内包表記
集合には内包表記があります。以下のように記述します。
{式 for 変数 in イテラブル if 条件式}
作成された要素の内容はリスト内包表記と同じですが、重複した内容は削除されます。また、順番は保証されません。
次回も集合
いかがでしょうか。集合は、工夫すると色々使えるところがありそうです。次回は集合の使い道について考えてみます。お楽しみに!!