【Python】set型(集合)の使い方を初心者向けに徹底解説!重複削除や集合演算も紹介!

Pythonのset型(集合)の使い方解説

※このサイトの記事内では広告を掲載している場合があります。

Pythonで「リストの中から重複を消したい」「2つのデータに共通する要素だけを取り出したい」と思ったことはありませんか?for文とif文を組み合わせて頑張って書くこともできますが、実はもっとシンプルに解決できる仕組みがPythonには用意されています。それが今回ご紹介する set(集合)型 です。

この記事では、set型の基本的な作り方から、要素の追加・削除、和集合・積集合といった集合演算、そして実務でよく使う「重複削除」のテクニックまで、初心者の方にも分かりやすく丁寧に解説していきます。読み終わるころには、setを使ってコードをスッキリ書けるようになっているはずです。

set(集合)型とは?

setとは、重複しない要素の集まりを表すPythonのデータ型です。数学で習った「集合」とほぼ同じイメージで、同じ値は1つしか持てず、要素には順序がないという特徴があります。

まずは実際に作って、その性質を見てみましょう。波カッコ {} の中に要素をカンマ区切りで書くと、set型になります。

fruits = {"apple", "banana", "orange"}
print(fruits)
# {'banana', 'orange', 'apple'}  (順序は保証されません)

print(type(fruits))
# <class 'set'>

注目してほしいのは、出力されたときの順序が書いた順番とは限らないという点です。setは要素の順序を管理しないため、表示順は実行環境によって変わることがあります。「順番を保ちたい」という場合はリストを使いましょう。リストについては、要素の追加方法などをまとめた記事も参考になります。

setの作り方(2つの方法)

① 波カッコ {} で直接作る

先ほどのように、波カッコの中に値を並べるだけでsetが作れます。同じ値を複数書いても、自動的に1つにまとめられます。

colors = {"red", "blue", "red", "blue"}
print(colors)
# {'red', 'blue'}  重複は自動で除かれる

② set() 関数でリストから作る

既存のリストやタプルを set() 関数に渡すと、重複を取り除いたsetに変換できます。これが「重複削除」で最もよく使うパターンです。

numbers = [1, 2, 2, 3, 3, 3]
unique = set(numbers)
print(unique)
# {1, 2, 3}

なお、リストと似た仲間であるタプル(tuple)からも同じようにsetを作れます。タプルとの違いを整理しておくと、データ型の使い分けがより理解しやすくなりますよ。

ひとつ注意点として、空のsetを作るときは {} ではなく set() と書きます{} は空の辞書(dict)になってしまうためです。これは初心者がつまずきやすいポイントなので、覚えておきましょう。

empty_set = set()    # 空のset
empty_dict = {}      # これは空の辞書(dict)
print(type(empty_set))   # <class 'set'>
print(type(empty_dict))  # <class 'dict'>

要素の追加と削除

setに後から要素を追加するには add()、削除するには discard()remove() を使います。

colors = {"red", "blue"}

colors.add("green")
print(colors)   # {'red', 'blue', 'green'}

colors.discard("red")
print(colors)   # {'blue', 'green'}

# discard は存在しない要素を指定してもエラーにならない
colors.discard("yellow")
print(colors)   # {'blue', 'green'}

remove() も削除に使えますが、存在しない要素を指定するとエラー(KeyError)になります。エラーを出したくない場合は discard() を使うと安全です。

集合演算(和・積・差・対称差)

setの真骨頂が、この集合演算です。2つのsetを使って「共通する要素」「片方にしかない要素」などを、たった1行で求められます。

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

print(a | b)  # 和集合(どちらかに含まれる)   {1, 2, 3, 4, 5, 6}
print(a & b)  # 積集合(両方に含まれる)       {3, 4}
print(a - b)  # 差集合(aだけに含まれる)       {1, 2}
print(a ^ b)  # 対称差(どちらか一方だけ)     {1, 2, 5, 6}

「2つのリストに共通するユーザーを抽出する」「片方のデータにしか存在しない項目を探す」といった処理が、for文を何重にもネストすることなく書けてしまいます。コードが短くなるだけでなく、処理も高速になるのが嬉しいポイントです。

実用例:リストの重複を削除してユニーク数を数える

実務で本当によく使うのが、重複したデータの整理です。例えばメールアドレスのリストから、重複を除いた「実際の人数」を求めてみましょう。

emails = ["a@example.com", "b@example.com", "a@example.com", "c@example.com"]

unique_emails = set(emails)
print(unique_emails)        # {'a@example.com', 'b@example.com', 'c@example.com'}
print(len(unique_emails))   # 3  (ユニークなメール数)

set() で囲んで len() で数えるだけ。たった2行で「重複を除いた件数」が分かります。アンケートの回答集計や、データのクリーニングなどで大活躍するテクニックです。

set内包表記でスマートに作る

リストに「リスト内包表記」があるように、setにもset内包表記があります。波カッコの中に for を書くだけで、条件に合うsetを一気に生成できます。

# 0〜4の2乗をsetで作る
squares = {n ** 2 for n in range(5)}
print(squares)   # {0, 1, 4, 9, 16}

# 偶数だけを集める
evens = {n for n in range(10) if n % 2 == 0}
print(evens)     # {0, 2, 4, 6, 8}

書き方はリスト内包表記とほとんど同じで、外側を波カッコにするだけです。仕組みをしっかり理解したい方は、リスト内包表記の解説記事とあわせて読むと、内包表記の考え方が一気に身につきますよ。

setを使うときの注意点

便利なsetですが、いくつか気をつけたい性質があります。使う前に押さえておきましょう。

  • 順序を持たないため、fruits[0] のようなインデックスでのアクセスはできません。
  • 重複を持てないため、同じ値を追加しても要素数は増えません。
  • 要素にできるのは数値・文字列・タプルなど変更できない(イミュータブルな)値だけで、リストや辞書はsetの要素にできません。
  • 空のsetは {} ではなく set() で作ります({} は空の辞書になります)。

もっと効率的にPythonを学びたい人へ

ここまでset型の使い方を見てきましたが、独学で進めていると「この書き方で合っているのかな?」「もっと良い方法があるのでは?」と不安になる場面も多いものです。そんなときは、プロに直接質問できる環境があると学習スピードが一気に上がります。

マンツーマン指導でつまずきをその場で解消できるスクールなら、未経験からのPython習得や転職サポートまで一気通貫でサポートしてもらえます。まずは無料カウンセリングで、自分に合った学習プランを相談してみるのがおすすめです。

※本記事には広告(アフィリエイトリンク)を含みます。

Pythonプログラミング|マンツーマンレッスンで初めてをプロに育てる【Python Winner】

まとめ

今回はPythonのset(集合)型について解説しました。要点を振り返っておきましょう。

  • setは重複しない・順序を持たない要素の集まり。
  • 作り方は波カッコ {}set() 関数。空のsetは set() で作る。
  • add() で追加、discard() / remove() で削除。
  • |(和)&(積)-(差)^(対称差)で集合演算ができる。
  • リストを set() で囲めば重複削除が一発。len() でユニーク数も分かる。
  • set内包表記を使えば、条件付きのsetもスマートに作れる。

リストや辞書、タプルとあわせてsetを使いこなせるようになると、Pythonのデータ処理がぐっと楽になります。ぜひ手を動かして試してみてくださいね。

コメントを残す

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

CAPTCHA