【Python】Setとは?基本から書き方までコード付きで解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年7月)

✔当記事は以下のような方へ向けて書かれた記事です

「Pythonのsetって何ができるのだろうか?」

「Pythonのsetの使い方が知りたい」

「Pythonのsetの実例が見たい」

✔当記事を通じてお伝えすること

  • Pythonのsetの基本
  • Pythonのsetの使い方やその応用
  • Pythonのsetの実例

当記事では、Pythonのsetの基本だけでなく、そのメソッドを活用した使い方まで、具体例を用いて詳しく解説しています。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Pythonのset(集合)とは?

こちらでは、Pythonのset(集合)オブジェクトについてお伝えしていきます。

setオブジェクトの特徴を理解し、その利用の幅を広げましょう。

  • Pythonのsetとは
  • setを使うメリット
  • setの利用場面
  • setと辞書の違い

Pythonのsetとは

Pythonのsetオブジェクトは、順序がなく、重複した要素を持たないコレクションのことです。

集合は、数学的な集合と同様に操作でき、以下のような演算が可能になります。

  • 要素の追加
  • 要素の削除
  • 和集合
  • 積集合

また、Pythonのsetはハッシュ表に基づいて実装されているため、要素の検索が非常に高速です。

setを使うメリット

Pythonのsetは非常に便利なデータ構造であり、いくつかの特定の状況下で利用するメリットがあります。

  1. 一意性: Setは重複する要素を持つことができません。すなわち、ある要素はSetに一度しか存在することができません。これは、リストや他のデータ構造から一意な要素を迅速に抽出するのに役立ちます。
  2. メンバーシップテストの高速化: Setは、特定の要素がその中に存在するかどうかを確認するのに非常に高速です。大規模なデータセットにおいては、リストよりもSetでメンバーシップテストを行った方がはるかに効率的です。
  3. 集合演算: Setは、数学的な集合演算(結合、交差、差、対称差)を行うのに役立ちます。これらの演算は、特に2つ以上のグループ間で共通の要素を見つける、または特定のグループから要素を除外する、といった場合に有用です。
  4. 要素の順序の除去: Setは順序を持たないため、要素の順序が重要でない場合、または順序を無視したい場合に便利です。

ただしSetにも限界があります。

要素の順序が重要な場合や、同じ要素を複数回含める必要がある場合には、Setは適切なデータ構造とは言えません。

これらの状況では、リストや他のデータ構造を使用する方が良いでしょう。

setの利用場面

Pythonのsetは一意性と順序を持たないデータ構造を必要とするさまざまな場面で利用できます。

以下がその使用です。

  • 一意な要素の抽出
  • 集合演算
  • メンバーシップテストの高速化

一意な要素の抽出

setはその要素が一意であるため、リストや他のイテラブルから重複する要素を削除するのに役立ちます。

numbers = [1, 2, 2, 3, 4, 4, 4, 5, 6, 6, 7]
unique_numbers = set(numbers)
print(unique_numbers)  # 出力: {1, 2, 3, 4, 5, 6, 7}

集合演算

setは数学的な集合演算(結合、交差、差、対称差)をおこなうのに適しています。

set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}

print(set_a.intersection(set_b))  # 出力: {3, 4}
print(set_a.union(set_b))  # 出力: {1, 2, 3, 4, 5, 6}
print(set_a.difference(set_b))  # 出力: {1, 2}

メンバーシップテストの高速化

要素の存在確認はsetでは非常に高速におこなえます。

したがって、大規模なデータの中から要素を探す場合にはsetを利用すると効率的です。

large_set = set(range(0, 1000000))
print(999999 in large_set)  # 出力: True

setと辞書の違い|作る際の注意点

setは、{}で囲われた型なので、辞書と似ています。

しかし、キーが無いため特定の値を取り出せないのが特徴です。

辞書と混合しないために気を付けるべき点は、空のsetを作るとき。

空のset型を作る時は、以下のとおりです。

empty_set = set()

#以下は辞書になる
empty_dict = {}

set(集合)の作成方法

set(集合)の作成方法について解説します。

Pythonで集合を生成するための方法は複数です。

  • 波括弧({})を使って生成
  • コンストラクタset()で生成
  • 集合内包表記
  • 他データからの変換

波括弧({})を使って生成

Pythonでは、波括弧を使用して直接集合を作成できます。

my_set = {1, 2, 3}

ただし、空の波括弧{}は辞書を生成するため、空の集合を作る場合はset()を使用してください。

empty_set = set()

コンストラクタset()で生成

set()コンストラクタを使用して、既存のリストやタプルから集合を生成できます。

my_set = set([1, 2, 3])

リスト型をset型へ

>>> fruits_list
['banana', 'apple', 'pineapple']
>>> set(fruits_list)
{'banana', 'pineapple', 'apple'}

タプル型をset型へ

>>> fruits_tuple
('banana', 'apple', 'pineapple')
>>> set(fruits_tuple)
{'banana', 'pineapple', 'apple'}

辞書型をset型へ

>>> fruits_dictionary
{1: 'banana', 2: 'apple', 3: 'pineapple'}
>>> set(fruits_dictionary)
{1, 2, 3}

#値をset型にする
>>> set(fruits_dictionary.values())
{'banana', 'pineapple', 'apple'}

文字列型をset型へ

>>> fruit_string
'banana'
>>> set(fruit_string)
{'a', 'n', 'b'}

1文字ずつとなり、重複したものは削除されます。

集合内包表記

集合内包表記を使用すると、既存のコレクションやイテラブルから派生した新しい集合をコンパクトに生成可能です。

squared_set = {x**2 for x in range(5)}

要素を操作・確認する主なメソッド

集合に要素を追加したり、削除する方法について解説します。

  • 要素を追加:add()
  • 要素を削除:discard(), remove(), pop(), clear()
  • 要素数を確認:len

要素を追加:add()

add()メソッドを使用して、集合に新しい要素を追加できます。

このメソッドは引数として追加する要素を取り、その要素を集合に追加するものです。

my_set.add(4)

要素を削除:discard(), remove(), pop(), clear()

要素を削除する各メソッドの特徴はこちらです。

  • remove():要素が存在しない場合にエラーを引き起こす
  • discard():要素が存在しなくてもエラーを引き起こさない
  • pop()メソッド:集合から任意の要素を削除して返す
  • clear()メソッド:集合からすべての要素を削除する
fruits = {"apple", "banana", "orange"}

# discard()メソッドを使用して要素を削除
fruits.discard("banana")
print(fruits)  # 出力: {'orange', 'apple'}

# remove()メソッドを使用して要素を削除
fruits.remove("apple")
print(fruits)  # 出力: {'orange'}

# 存在しない要素をremove()メソッドで削除するとエラーが発生する
fruits.remove("grape")  # エラー: KeyError: 'grape'

# discard()メソッドを使用して存在しない要素を削除
fruits.discard("grape")

# pop()メソッドで任意の要素を削除
removed_element = fruits.pop()
print(fruits)  # 出力: set()
print(removed_element)  # 出力: 'orange'

# clear()メソッドですべての要素を削除
fruits.clear()
print(fruits)  # 出力: set()

要素数を確認:len()

len()関数を使用すると、集合の要素数を取得できます。

num_elements = len(my_set)

集合演算

Pythonのsetは数学的な集合演算をサポートしており、これについて解説します。

  • 和集合(ユニオン):|演算子, union()
  • 積集合(インターセクション):&演算子, intersection()
  • 差集合:-演算子, difference()
  • 対称差集合:^演算子, symmetric_difference()

和集合(ユニオン):|演算子, union()

和集合は、2つの集合にある全要素を含む集合です。

|演算子またはunion()メソッドを使用して和集合を求められます。

set1 = {1, 2, 3}
set2 = {3, 4, 5}

# |演算子を使用して和集合を求める
union_set = set1 | set2
print(union_set)  # 出力: {1, 2, 3, 4, 5}

# union()メソッドを使用して和集合を求める
union_set = set1.union(set2)
print(union_set)  # 出力: {1, 2, 3, 4, 5}

積集合(インターセクション):&演算子, intersection()

積集合は、2つの集合に共通する要素のみを含む集合です。

&演算子またはintersection()メソッドを使用して積集合を求めることができます。

set1 = {1, 2, 3}
set2 = {3, 4, 5}

# &演算子を使用して積集合を求める
intersection_set = set1 & set2
print(intersection_set)  # 出力: {3}

# intersection()メソッドを使用して積集合を求める
intersection_set = set1.intersection(set2)
print(intersection_set)  # 出力: {3}

差集合:-演算子, difference()

差集合は、ある集合からもうひとつの集合の要素を除いたものです。

-演算子またはdifference()メソッドを使用します。

set1 = {1, 2, 3, 4, 5}
set2 = {3, 4, 5, 6, 7}

# -演算子を使用して差集合を求める
difference_set = set1 - set2
print(difference_set)  # 出力: {1, 2}

# difference()メソッドを使用して差集合を求める
difference_set = set1.difference(set2)
print(difference_set)  # 出力: {1, 2}

対称差集合:^演算子, symmetric_difference()

対称差は、2つの集合のうちどちらか一方に属する要素のみを含む集合です。

^演算子または`symmetric_difference()メソッドを使用します。

set1 = {1, 2, 3, 4, 5}
set2 = {3, 4, 5, 6, 7}

# ^演算子を使用して対称差を求める
symmetric_difference_set = set1 ^ set2
print(symmetric_difference_set)  # 出力: {1, 2, 6, 7}

# symmetric_difference()メソッドを使用して対称差を求める
symmetric_difference_set = set1.symmetric_difference(set2)
print(symmetric_difference_set)  # 出力: {1, 2, 6, 7}

集合の比較

集合間の関係を比較する方法について解説します。

比較した結果をBoolean(TrueもしくはFalse)で返すメソッドです。

  • 部分集合か判定:<=演算子, issubset()
  • 上位集合か判定:>=演算子, issuperset()
  • 互いに素か判定:isdisjoint()

部分集合か判定:<=演算子, issubset()

ある集合が他の集合の部分集合であるかどうかを判定するには、<=演算子またはissubset()メソッドを使用します。

set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5}

# <= 演算子を使用して部分集合かどうかを判定する
is_subset = set1 <= set2
print(is_subset)  # 出力: True

# issubset() メソッドを使用して部分集合かどうかを判定する
is_subset = set1.issubset(set2)
print(is_subset)  # 出力: True

上位集合か判定:>=演算子, issuperset()

ある集合が他の集合の上位集合であるかどうかを判定するには、>=演算子またはissuperset()メソッドを使用します。

set1 = {1, 2, 3, 4, 5}
set2 = {1, 2, 3}

# >= 演算子を使用して上位集合かどうかを判定する
is_superset = set1 >= set2
print(is_superset)  # 出力: True

# issuperset() メソッドを使用して上位集合かどうかを判定する
is_superset = set1.issuperset(set2)
print(is_superset)  # 出力: True

互いに素か判定:isdisjoint()

2つの集合が互いに素である(共通する要素を持たない)かどうかを判定するには、isdisjoint()メソッドを使用します。

set1 = {1, 2, 3}
set2 = {4, 5, 6}

# isdisjoint() メソッドを使用して互いに素かどうかを判定する
is_disjoint = set1.isdisjoint(set2)
print(is_disjoint)  # 出力: True

集合の活用例と応用

集合を活用する具体的な例と、応用的な使い方について解説します。

  • データのユニークな要素の抽出
  • 共通要素の抽出
  • 条件を満たす要素のフィルタリング

データのユニークな要素の抽出

集合は重複する要素を持たないため、リストやタプルからユニークな要素を抽出するのに適しています。

unique_elements = set([1, 2, 2, 3, 4, 4, 5])

共通要素の抽出

積集合を利用して、2つ以上のデータセットの共通要素を抽出可能です。

common_elements = set1 & set2

条件を満たす要素のフィルタリング

集合内包表記を利用して、特定の条件を満たす要素だけを持つ新しい集合を作成できます。

even_numbers = {x for x in set1 if x % 2 == 0}

まとめ

当記事では、Pythonのset(集合)についての基本的な知識と操作方法について学習してきました。

  • 基本的な特性
  • 生成方法
  • 要素の追加や削除
  • 集合演算
  • 応用的な使用例

set(集合)は非常に便利なデータ型であり、日常的なプログラミングタスクで頻繁に利用されます。

実際のプロジェクトで積極的に使用し、さらに深く理解を深めてください。

タイトルとURLをコピーしました