Pythonの集合型は、重複する要素を持たない要素の集まりを表すデータ型です。複数の要素を持つという点で、リストやタプル、辞書型と似ている点もありますが、それらのデータが、主に保存された値を個別に扱う(インデックスを用いてアクセスする)のに対し、集合型では、集合として格納された値をひとまとまりにして操作する点が大きく異なります。統計・数学の演算を得意とするPythonらしい、数学の集合を実現するのに適したデータ型になります。
集合型には、値を変更出来るset型と、値を変更出来ないfrozenset型があります。これは、それぞれリスト型とタプル型の関係に近いと考えると分かりやすいと思います。
集合型は、そもそも重複する値を格納することができないので重複する要素を除去したり、複数の集合から要素を抽出するときなどに便利です。
集合の定義
# 集合の定義
fruits = {'apple', 'banana', 'cherry'}
print(fruits) # Output: {'apple', 'banana', 'cherry'}
集合は辞書型と同様に波括弧 {} を使って定義します。ただし、キー:値のペアではないので、各要素に : コロンを含めません。
要素の追加
# 集合の定義
fruits = {'apple', 'banana', 'cherry'}
# 要素の追加
fruits.add('orange')
print(fruits) # Output: {'apple', 'banana', 'cherry', 'orange'}
要素の追加にはaddメソッドを使用します。リストとは異なり、インデックスによる追加はできません。
要素の削除
# 集合の定義
fruits = {'apple', 'banana', 'cherry'}
# 要素の削除
fruits.remove('banana')
print(fruits) # Output: {'apple', 'cherry'}
要素の削除はremoveメソッドを使用します。リストとは異なり、削除する要素の特定にはインデックスではなく値を指定します。リスト型でも値を指定した削除はできますが、集合の場合、インデックスがないことに加え、重複した値を持たないため、簡潔かつ明瞭な記法になります。
集合の積を求める
# 集合の定義
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
# 積集合
intersection = set1 & set2
print(intersection) # Output: {3, 4}
日常ではあまり使いませんが、数学の集合における積と同様の処理を行います。
積集合というよりは、「2つの集合における共通の要素を抽出する」と考えた方が分かりやすいかもしれません。データベースの処理などで用いられることも多く、 RDBMSなどと接続しなくても、Excel ファイルや CSV ファイルを扱ってデータを整理する場合などに便利です。
集合の和を求める
# 集合の定義
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
# 和集合
union = set1 | set2
print(union) # Output: {1, 2, 3, 4, 5, 6}
2つの集合を結合します。リストも結合できますが、集合なので重複する要素があった場合は、自動的に除外されます。これも、Excel ファイルや CSV ファイルの処理で活躍します。たとえば、会員リストを結合して一つのメールアドレスのリストにする場合などに便利です。
集合の差を求める
# 集合の定義
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
# 差集合
difference = set1 - set2
print(difference) # Output: {1, 2}
左辺の集合から、右辺の集合に含まれる要素を全て削除します。remove メソッドと違って、複数の要素をまとめて削除することができます。
また、右辺の集合に左辺の集合にない値が含まれていた場合も、特別エラーなどは発生しません。
名簿の例で言えば、退会希望者をまとめて削除する、といった処理が可能です。
対称差集合を求める
# 集合の定義
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
# 対称差集合
symmetric_difference = set1 ^ set2
print(symmetric_difference) # Output: {1, 2, 5, 6}
なんだか難しい名前がついていますが、「2つの集合で重複する値は削除し、重複していない値は残して両方の集合の和を求める」演算です。
プログラミングになれている人は、排他的論理和、XORと考えた方が分かりやすいかもしれません。日常的なアプリケーションでは余り使わない応用的な演算ですが、データ分析などでは使用します。
リストから集合への変換
my_list = [1, 2, 3, 4, 5, 1, 2, 3]
my_set = set(my_list)
print(my_set) # {1, 2, 3, 4, 5}
集合からリストへの変換
my_set = {1, 2, 3, 4, 5}
my_list = list(my_set)
print(my_list) # [1, 2, 3, 4, 5]
終わりに
集合型は、重複しない複数の値をまとめて処理するのに向いた型です。そのため、一括した値の削除や追加をしたいリストを集合に変換し前処理を集合で行った後、リストに再度変換して各値を個別に処理するといった手法が有効です。
日常的な業務を処理するアプリケーションでも有効な型ですが、ビッグデータを分析したり、機械学習の学習データを事前処理したりといった近年注目度が非常に高くなっている処理に向いています。
Python がこれらの処理に向いているとされる理由の一つでもあるため、覚えておくと便利です。