これまでリスト(https://augmented-vr.com/use-lists-in-python/)やタプル(https://augmented-vr.com/how-to-use-python-tuple/)など、複数のデータを扱うデータ型を学習してきました。今回は、これらとは少し毛色の違う「set(集合)」というデータ型について解説します。データ分析や数学的な処理を行う際に非常に便利な機能です。

set(集合)を使用する

Pythonでsetを作成するには、変数名、イコール「=」、波括弧「{}」を使います。辞書(dict)も波括弧を使いますが、キーと値のペア(コロンで区切る)ではなく、データだけをカンマ「,」で区切って記述するとsetになります。また、空のsetを作るときはset()関数を使います。(空の波括弧{}を使うと空の辞書になってしまうためです。)

なので例としてsetは、

変数名 = {データ1, データ2, データ3, ・・・}

の形式で記述します。

set(集合)の2つの大きな特徴

setを理解する上で、絶対に覚えておきたい特徴が2つあります。

  • 重複したデータを持てない: 同じデータを何度追加しても、setの中には1つしか保存されません。
  • 順序(インデックス)がない: リストのように「0番目」「1番目」という順番の概念がないため、[0]のように指定してデータを取り出すことはできません。

この性質により、setは「データが『ある』か『ない』か」だけを純粋に管理するのに適しています。

データの追加と削除

setに対して要素を追加したり削除したりするメソッド(機能)を見ていきましょう。

  • 要素の追加(add): リストではデータを末尾に付け足すためappend()を使いましたが、setには「順序(末尾)」という概念が存在しません。そのため、純粋に「追加する」という意味のadd()を使います。また、add()でデータを追加する際、Pythonの裏側では「ハッシュ値」と呼ばれるデータの指紋のようなものを計算し、「すでに同じデータが存在するか?」を一瞬でチェックしています。もし既に存在すれば追加処理をスキップし、存在しなければ安全に追加するという、重複を防ぐ賢い処理が行われています。
  • 要素の削除(remove): remove()は、指定されたデータをsetの中から探し出して消去します。これもハッシュ値を使って探すため、すぐに目当てのデータを見つけ出して消すことができます。リストの中からデータを探し出して消すよりも圧倒的に速い処理が行われています。ただし、存在しないデータをremove()しようとするとエラーになる点には注意が必要です。

数学的な「集合演算」の力

setの最大の魅力は、数学のベン図(丸が重なっている図)で習うような「集合演算」が専用の記号(演算子)を使ってたった1行で書けることです。これを使うと、2つのグループ(set)の共通点や違いを一瞬で見つけることができます。

  • 和集合 | (OR): この|(縦線、パイプと呼ぶ)は「論理和(OR)」を表す演算子です。「AまたはBのどちらか一方にでも含まれているもの」をすべて1つのsetに集めます。この時、両方に存在する要素は、setの「重複を許さない」という絶対のルールによって自動的に1つにまとめられます。
  • 積集合 & (AND): この&(アンドマーク、アンパサンドと呼ぶ)は「論理積(AND)」を表す演算子です。「AとBの両方に共通して存在しているデータ」だけを抽出して新しいsetを作ります。例えば、「Aさんのフォロワー」と「Bさんのフォロワー」の共通のフォロワーを割り出したい時などに裏側でこの処理が使われます。
  • 差集合 - (Minus): この-(マイナス)は文字通り「引き算」を表します(キーボードではハイフンや伸ばし棒と同じキーを使って入力します)。「左側のAのデータ群の中から、右側のBにも含まれているデータを取り除く」という処理をします。Aの中にあるデータがBにも存在する場合は消去され、Aにしか存在しないデータだけが残ります。

では、実際にやってみましょう。 Google Colaboratory (Colab)を開いて新しいノートブックを作成し、setを作成してデータを追加・削除する基本的なプログラムを書いてみます。

# 果物のsetを作成する
fruits = {"もも", "なし", "かき"}

# 新しいデータを追加する
fruits.add("ぶどう")

# 既存のデータを削除する
fruits.remove("もも")

# 結果を表示する
print(fruits)

とセルに入力して実行してみましょう。すると結果は

{‘ぶどう’, ‘なし’, ‘かき’}

のように表示されます。(setには順序がないため、表示される順番は実行するたびに変わる可能性があります)

プログラムの解説(基本的な使い方)

  • setの作成(2行目): 変数fruits に波括弧を使って3つの文字列データを持つsetを代入しています。
  • 要素の追加(5行目): fruits.add("ぶどう") を使って新しいデータを追加しています。
  • 要素の削除(8行目): fruits.remove("もも") を使って指定したデータを消去しています。

数学的な集合演算(和集合・積集合など)

続いて、setの最大の強みである数学的な「集合演算」を行うプログラムを書いてみます。

Colabの新しいセルに以下のコードを入力してみましょう。

# 2つのset(グループ)を用意する
group_a = {1, 2, 3, 4}
group_b = {3, 4, 5, 6}

# 和集合(両方を合わせたもの)
print(group_a | group_b)

# 積集合(共通しているもの)
print(group_a & group_b)

# 差集合(AからBを引いたもの)
print(group_a - group_b)

とセルに入力して実行してみましょう。すると結果は

{1, 2, 3, 4, 5, 6}
{3, 4}
{1, 2}

と表示されます。

プログラムの解説(集合演算)

  • 和集合(6行目): group_a | group_b と記述し、2つのグループの要素を合わせた新しいsetを作成して表示しています。
  • 積集合(9行目): group_a & group_b と記述し、2つのグループに共通しているデータだけを抽出して表示しています。
  • 差集合(12行目): group_a - group_b と記述し、group_aからgroup_bにも含まれるデータを引いた結果を表示しています。

まとめ

今回は、重複のないデータを扱い、グループ同士の比較ができる「set(集合)」について解説しました。

  • setの作り方: 波括弧{}でデータをカンマ区切りにするか、空の場合はset()を使う。
  • 大きな特徴: 「重複したデータを持てない」「順序がない」という2つの性質を持つ。
  • 追加と削除: add()remove()を使う。リストより検索や追加が圧倒的に速い。
  • 集合演算
    • 和集合|: 2つのグループを全て合わせる(重複は排除される)。
    • 積集合&: 2つのグループの共通部分だけを取り出す。
    • 差集合-: 左のグループから、右のグループと共通するものを引く。

リストや辞書に比べると少しマニアックに見えるかもしれませんが、使いどころが分かるとプログラムのコードを劇的に短く、そして速くすることができる素晴らしい機能です。ぜひ色々なデータを比較して試してみてください。

open-in-colab

今回はこれで終了です。
今回のサンプルを用意したので、もし必要な場合は上の「Open in Colab」と書いてあるボタンをクリックしてください。なおそのままだと編集不可なので編集をしたい場合は「ドライブにコピー」をクリックしてコピーしてください。
なおGoogle ColaboratoryについてわからなかったらGoogleColaboratoryを使ってみよう_導入編をご覧ください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA