Pythonのセット(set)完全ガイド:作成・追加・削除・集合演算の基本を解説
データを扱っていると、重複する値を含まず、値が勝手に変更されないリストを保存したい場面によく出くわします。たとえば、食料品店の購入IDの一覧を作成する場合、各IDは一意であるべきで、リスト内の値を誰にも変更されたくないはずです。
そんなときに役立つのが、Pythonのセット(set)オブジェクトです。セットとは、一意な値のみを格納できる、順序のないコレクションです。
この記事では、具体例を交えながら、Pythonセットの基礎と、要素の追加・削除などよく使う操作の方法について解説します。
Pythonのセットとは
Pythonに組み込まれているセットというデータ構造は、数学における「集合」の概念に近いものです。
Pythonのセットは0個以上の要素を格納でき、セット内の各要素には決まった順序がありません。セットに格納されるすべての要素は一意であるため、重複は存在できません。また、セット内の個々の値は変更できません。
ただし、個々の値を変更できないだけで、セット自体は変更可能です。つまり、セットへの要素の追加や削除は自由に行えます。
セット構造が便利なのは、セットに保存したデータを操作するための数学的な演算が数多く用意されている点です。
Pythonセットの作成方法
Pythonでは、セットはカンマで区切られた項目(「要素」)のリストとして定義し、その全体を波括弧({})で囲みます。
セットは任意の数の項目を格納でき、各項目には異なるデータ型を使用できます。たとえば、整数と文字列を一緒に格納したり、文字列・浮動小数点数・タプルを組み合わせたりすることも可能です。ただし、別のセット、辞書、リストのような可変(ミュータブル)なデータ型は格納できないので注意してください。
たとえば、ある生徒が英語の授業で提出した課題の一覧を格納するセットを作成したいとしましょう。次のようなコードで作成できます。
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7", "End of Topic Review #2"}
print(assignments)
このコードを実行すると、次のように出力されます。
{'Worksheet #5', 'Worksheet #4', 'Worksheet #7', 'End of Topic Review #2'}
このコードでは、4つの値を持つ assignments というセットを定義し、その内容をコンソールに出力しました。セットは項目を特定の順序で保持しないため、値がランダムな順序で返されていることがわかります。
セットの変更
セットを作成すると、セット内の項目の値そのものを変更することはできません。しかし、セットへの項目の追加や削除は可能です。
セットへの要素追加
Pythonのセットに要素を追加するには、add() メソッドを使用します。たとえば、生徒が Worksheet #8 を提出したばかりで、その提出状況を追跡できるようセットを更新したい場合は、次のようなコードを使います。
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7", "End of Topic Review #2"}
assignments.add("Worksheet #8")
print(assignments)
実行結果:
{'Worksheet #8', 'Worksheet #4', 'Worksheet #5', 'End of Topic Review #2', 'Worksheet #7'}
ご覧のとおり、Worksheet #8 がセットに追加されました。
また、複数の項目を一度にセットへ追加したい場合は、update() メソッドを使用します。update() メソッドは、追加したい項目のリストを引数として受け取り、それらの項目をまとめてセットに追加します。
たとえば、生徒がワークシート#8と#9の両方を提出した場合、次のコードで新しい課題の提出を反映できます。
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7", "End of Topic Review #2"}
assignments.update(["Worksheet #8", "Worksheet #9"])
print(assignments)
実行結果:
{'Worksheet #9', 'End of Topic Review #2', 'Worksheet #8', 'Worksheet #7', 'Worksheet #4', 'Worksheet #5'}
これで、セットには Worksheet #8 と Worksheet #9 の2つの新しい値が含まれるようになりました。
セットからの要素削除
セットから要素を削除するには、discard() または remove() を使用します。
discard() 関数はセットから項目を削除しますが、指定した項目がセットに存在しない場合でもエラーにはなりません。一方、remove() 関数はセットから項目を削除しようとし、その項目が存在しない場合はエラー(KeyError)が発生します。用途に応じて使い分けるとよいでしょう。
たとえば、生徒にワークシート#9のやり直しが求められたため、提出記録から Worksheet #9 を削除したいとしましょう。次のようなコードで実現できます。
assignments = {'Worksheet #9', 'End of Topic Review #2', 'Worksheet #8', 'Worksheet #7', 'Worksheet #4', 'Worksheet #5'}
assignments.discard("Worksheet #9")
print(assignments)
実行結果:
{'End of Topic Review #2', 'Worksheet #5', 'Worksheet #4', 'Worksheet #8', 'Worksheet #7'}
Worksheet #9 がセットから削除されたことがわかります。ここでは discard() メソッドを使用しました。
セットのクリア
セットの中身をすべて空にするには、clear() メソッドを使用します。たとえば、年度末になって生徒の課題記録が不要になったため、情報を消去したい場合は、次のようなコードを使います。
assignments = {'Worksheet #9', 'End of Topic Review #2', 'Worksheet #8', 'Worksheet #7', 'Worksheet #4', 'Worksheet #5'}
assignments.clear()
print(assignments)
実行結果は {} となり、空のセットであることが確認できます。
セットの長さ(要素数)を取得する
セットにいくつの項目が格納されているかを調べるには、len() メソッドを使用します。
たとえば、生徒がいくつの宿題を提出したかを知りたい場合は、次のようなコードを使います。
assignments = {'Worksheet #9', 'End of Topic Review #2', 'Worksheet #8', 'Worksheet #7', 'Worksheet #4', 'Worksheet #5'}
print(len(assignments))
実行結果は 6 です。このコードでは、まず assignments というセットを宣言し、次に len() メソッドを使って assignments セットに格納されている項目数を取得しています。
Pythonのセット演算
セットを使ってデータを保存する大きな利点のひとつは、数学的な集合演算がサポートされていることです。ここでは、主要な3つの集合演算の使い方を見ていきましょう。
なお、これらの集合演算は元のセットの内容を変更しません。既存のセットに対して計算を行い、結果を新しいセットとして返します。
和集合(union)
union() メソッドを使うと、2つのセットのすべての要素を含む新しいセットを作成できます。
たとえば、生徒の課題リストを2つ統合したいとしましょう。1つは宿題に関するデータ、もう1つは完了したエッセイ課題のリストです。これらのリストは、次のコードで統合できます。
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7"}
essays = {"Essay #1", "Essay #2"}
homework = assignments.union(essays)
print(homework)
実行結果:
{'Worksheet #7', 'Essay #2', 'Worksheet #4', 'Essay #1', 'Worksheet #5'}
このコードでは、union() メソッドを使って2つのセットを統合し、新しく統合されたセットを変数 homework に代入して、その値を出力しています。
また、次のように「|」演算子を使っても同じ結果が得られます。
assignments = {"Worksheet #4", "Worksheet #5", "Worksheet #7"}
essays = {"Essay #1", "Essay #2"}
print(assignments | essays)
「|」演算子は和集合の演算を行います。このコードも統合されたセットを返します。
{'Essay #2', 'Worksheet #4', 'Worksheet #5', 'Essay #1', 'Worksheet #7'}
積集合(intersection)
intersection() メソッドを使うと、2つのセットに共通する要素だけを抽出できます。
たとえば、生徒が提出したエッセイのリストと、課題として出されたエッセイのリストがあるとします。両方のリストに共通して含まれるエッセイを調べたい場合、intersectionメソッドを使えます。
使用するコードは次のとおりです。
essays_handed_in = {"Essay #1", "Essay #2"}
essays_issued = {"Essay #1", "Essay #2", "Essay #3"}
due = essays_handed_in.intersection(essays_issued)
print(due)
実行結果:
{'Essay #1', 'Essay #2'}
この例では、intersection() メソッドを使って、essays_handed_in と essays_issued の両方のセットに存在するすべての要素を検索しています。積集合の結果を変数 due に代入し、コンソールに出力しています。
さらに、「&」演算子を使っても積集合の演算ができます。先ほどの2つのセットに対して積集合を求めるには、次のようなコードを使います。
essays_handed_in = {"Essay #1", "Essay #2"}
essays_issued = {"Essay #1", "Essay #2", "Essay #3"}
print(essays_handed_in & essays_issued)
実行結果:
{'Essay #1', 'Essay #2'}
差集合(difference)
difference() メソッドを使うと、一方のセットには存在するが、もう一方のセットには存在しない要素を調べられます。
たとえば、生徒が提出済みで、まだ採点されていないすべてのエッセイのリストを作成したいとしましょう。次のようなコードで実現できます。
essays_handed_in = {"Essay #1", "Essay #2"}
essays_graded = {"Essay #1"}
final = essays_handed_in.difference(essays_graded)
print(final)
実行結果:
{"Essay #2"}
このコードでは、difference() メソッドを使って essays_handed_in と essays_graded の差を求めています。代わりに「-」演算子を使うこともできます。
essays_handed_in = {"Essay #1", "Essay #2"}
essays_graded = {"Essay #1"}
print(essays_handed_in - essays_graded)
実行結果:
{"Essay #2"}
同じ結果が返されました。こちらは difference() メソッドではなく、「-」演算子を使って2つのセットの差を計算しています。
まとめ
Pythonのセットというデータ構造を使うと、順序のないアイテムのコレクションを保存できます。
セット内の各要素は必ず一意であり、重複は存在できません。また、セットに追加された個々の値は後から変更できません。
この記事では、具体例を交えながら、Pythonセットの基礎と、セットが提供する主な操作について解説しました。
セットでできることはまだまだありますが、今回取り上げたのは、セットを効果的に扱うために知っておくべき主要なスキルです。これであなたも、プロのようにPythonの set() を使いこなす準備が整いました!
-
Pythonのセット(集合)操作を徹底解説!主要メソッドと演算子の使い方
数学における集合(セット)とは、互いに異なるオブジェクトの集まりであり、それ自体が一つのオブジェクトとして扱われるものです。たとえば、2、4、6という数値は個別に見ればそれぞれ独立したオブジェクトですが、ひとまとめに考えればサイズ3の一つの集合「{2, 4, 6}」を形成します。 Pythonのセットには次のような特徴があります。 重複した要素を持たない 順序が定義されていない(インデックスによるアクセス不可) ミュータブル(frozensetを除く) 集合に対する基本的な演算 演算 記法 意味 積集合(共通部分) A ∩ B AとBの両方に含まれるすべての要素 和集合 A ∪
-
Pythonのセット(set)とは?作成・操作・結合の基本を徹底解説
Pythonのセット(set)は、順序を持たない(unordered)コレクション型で、重複のない一意な(unique)かつ変更不可能な(immutable)オブジェクトを格納します。つまり、セットに同じ要素を複数入れることはできず、一度作成した要素そのものを書き換えることもできません。 ポイント: セットの「要素」はイミュータブル(変更不可)ですが、セット自体はミュータブル(変更可能)です。そのため、後から要素の追加や削除を行うことは可能です。 セットは順序を保持しません。同じセットを何度 print しても、表示される要素の並び順が変わることがあります。 Pythonでは、セットを波括弧