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のデータ処理がぐっと楽になります。ぜひ手を動かして試してみてくださいね。
ナノトイラボ 