Pythonのセット(set)の使い方!重複を排除する集合型の活用方法
生徒
「Pythonで同じ値が何度も入ってしまうのを防ぐにはどうすればいいですか?」
先生
「そんなときには、set(セット)というデータ型が便利です。同じ値を自動的に省いてくれる特徴がありますよ。」
生徒
「へぇー!リストとかタプルとはどう違うんですか?」
先生
「それでは、Pythonのセット型の使い方を、リストとの違いも含めて丁寧に解説していきましょう!」
1. Python de set(セット)とは?
Pythonのセット(set)型は、一言で言うと「重複を許さない、値の詰め合わせ」のことです。数学で習う「集合」と同じ考え方で、箱の中に同じボールを2つ入れることができない仕組みになっています。
プログラミング初心者の方にとって、リスト(list)と混同しやすいですが、セットには以下の2つの大きなルールがあります。
- 重複した値は自動的に消える: 同じデータを何度入れても、1つにまとめられます。
- 順番はバラバラ: 入れた順番は保持されず、取り出すたびに並びが変わることもあります。
セットを作るには、中かっこ {} を使い、要素をカンマで区切って記述します。実際のコードで、重複がどのように消えるか見てみましょう。
# 同じ色をいくつか含んだセットを作成
colors = {"赤", "青", "赤", "緑", "青", "黄色"}
# 中身を表示(重複していた「赤」と「青」が1つずつになっている)
print(colors)
# 要素の数を確認する len() 関数を使うと、重複を除いた数がわかる
print(len(colors))
{'緑', '赤', '黄色', '青'}
4
実行結果を見ると、5つ書いたはずのデータが「4つ」になっていますね。このように、Pythonのセットは「何種類あるか」を調べたり、ダブったデータを一瞬で掃除したりするときに非常に強力なツールとなります。
2. リストやタプルとの違い
Pythonで複数のデータを扱う際、よく使われるのが「リスト(list)」や「タプル(tuple)」ですが、セット(set)にはこれらと決定的に違う「3つの大きな特徴」があります。初心者の方は、まず以下の違いを整理しておきましょう。
| データ型 | 重複した値 | 順番(順序) | 主な用途 |
|---|---|---|---|
| リスト | 入れられる | ある(インデックスあり) | データの並びを管理する |
| タプル | 入れられる | ある(変更不可) | 値を書き換えられたくない時 |
| セット | 入れられない | なし(バラバラ) | 重複を消す・集合演算する |
最大の違いは、セットには「順番(インデックス)」という概念がないことです。リストなら colors[0] のように「0番目、1番目…」と指定してデータを取り出せますが、セットで同じことをしようとするとエラーが発生します。
# リストの場合:順番があるので0番目を取り出せる
list_colors = ["赤", "青", "緑"]
print(list_colors[0]) # 結果: 赤
# セットの場合:順番がないのでエラーになる
set_colors = {"赤", "青", "緑"}
print(set_colors[0])
TypeError: 'set' object is not subscriptable
この 'set' object is not subscriptable というエラーは、「セット型は添字(番号)で中身を指し示すことができませんよ」という意味です。もしセットの中身を1つずつ確認したい場合は、以下のように for 文を使って順番に取り出す方法が一般的です。
colors = {"赤", "青", "緑"}
for c in colors:
print(c)
実行するたびに取り出される順番が変わる可能性があるのも、セットならではの面白いポイントですね。特定の場所にあるデータが欲しいときは「リスト」、ユニークな(唯一の)データの集まりが欲しいときは「セット」というように、目的に合わせて使い分けましょう。
3. set型の作り方と基本操作
Pythonでセット(set)を作る方法は、大きく分けて2つあります。1つは波かっこ {} を使って直接書き込む方法、もう1つは set() という関数を使って既存のリストなどを変換する方法です。
プログラミング未経験の方にとって、最も便利な使い方は「手元のリストから重複をガバッと取り除く」ことでしょう。例えば、同じ数字が混ざったリストを set() に入れるだけで、一瞬で整理された状態になります。
# 1. 波かっこ {} で直接作る方法
fruits = {"りんご", "バナナ", "りんご", "オレンジ"}
print(fruits) # 「りんご」は1つにまとめられる
# 2. set() 関数を使って、リストから作る方法
# 同じ番号が混ざった出席番号リストがあるとします
id_list = [10, 20, 10, 30, 20, 40]
unique_ids = set(id_list)
print(unique_ids)
{'オレンジ', 'りんご', 'バナナ'}
{40, 10, 20, 30}
このように、set() 関数の中にリスト [ ] を入れるだけで、重複を自動的に排除したセットが完成します。データ分析や名簿整理などで「結局、何種類あるのか?」を知りたい時に、この set() 関数による変換は非常によく使われるテクニックです。
なお、空のセットを作りたい時だけは注意が必要です。empty = {} と書くと、Pythonは「辞書型(dict)」だと勘違いしてしまうため、空の場合は必ず empty = set() と書くルールになっています。
4. setに要素を追加する(add)
セットに新しい要素を追加したい場合は、add()メソッドを使います。
colors = {"赤", "青"}
colors.add("黄色")
print(colors)
{'赤', '青', '黄色'}
すでにある値を追加しても、重複は無視されます。
5. setから要素を削除する(remove/discard)
セットから特定の値を削除するにはremove()かdiscard()を使います。
colors = {"赤", "青", "緑"}
colors.remove("青")
print(colors)
{'赤', '緑'}
remove()は存在しない値を消そうとするとエラーになりますが、discard()はエラーにならずにスルーします。
6. セットの重複排除の活用例
たとえば、名前の一覧に重複があった場合、セットを使えば簡単に重複を消せます。
names = ["さとし", "ゆうこ", "さとし", "たけし", "ゆうこ"]
unique_names = set(names)
print(unique_names)
{'たけし', 'さとし', 'ゆうこ'}
簡単に一意な値だけを取り出すことができるので、データ整理に便利です。
7. 集合演算で差・共通点・和を計算しよう
Pythonのセットでは、数学で習う「集合」と同じように、集合演算ができます。
- 和集合(どちらかにある値)→
|またはunion() - 積集合(両方にある値)→
&またはintersection() - 差集合(一方にしかない値)→
-またはdifference()
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b) # 和集合
print(a & b) # 積集合
print(a - b) # 差集合
{1, 2, 3, 4, 5}
{3}
{1, 2}
このように、セットを使うと複雑なデータの比較や分析も簡単にできます。
8. セットの注意点と使いどころ
Pythonのセットは便利ですが、次のような注意点があります。
- 順番を持たないので
colors[0]のようなアクセスはできない - リストや辞書のようにソートされていない
- 中に入れられるのは変更できないデータ型のみ(リストなどは入れられない)
セットは、「重複をなくしたい」「データの中身を比較したい」「同じ値を1つだけ残したい」といったときにとても役立ちます。
まとめ
Pythonのセット型を総合的に振り返る
この記事では、Pythonのセット型について、基本的な考え方から具体的な使い方、注意点までを順番に学んできました。セットは、リストやタプルと同じく複数の値をまとめて扱えるデータ型ですが、「重複する値を自動的に排除する」「順番を持たない」という独自の特徴を持っています。この性質により、セットはデータ整理や比較処理において非常に強力な役割を果たします。
Pythonのセットは、中かっこを使って作成でき、同じ値をいくつ入れても一つにまとめられます。この動きは、実際にデータを扱う場面で大きなメリットになります。例えば、ユーザー名やタグ、カテゴリ名など、同じ情報が何度も出てくる可能性があるデータを扱う場合、セットを使うだけで自然に重複を防ぐことができます。リストで同じことをしようとすると、重複チェックの処理を書く必要があるため、コードが複雑になりがちです。
一方で、セットは順番を持たないため、インデックス番号で要素を指定して取り出すことはできません。この点は、リストやタプルとの大きな違いです。そのため、「順番が重要なデータ」や「決まった位置の値を使いたい処理」には向いていません。セットを使うかどうかを判断する際には、データの順序が必要かどうかを考えることが重要です。
addを使った要素の追加や、removeやdiscardを使った削除など、基本操作を理解することで、セットは柔軟に扱えるようになります。特に、discardは存在しない値を指定してもエラーにならないため、安全にデータを整理したい場面で役立ちます。また、リストをset関数で変換することで、簡単に重複を排除できる点は、実務でも学習でも頻繁に使われるテクニックです。
さらに、集合演算はセットならではの大きな強みです。和集合、積集合、差集合といった操作を使えば、二つのデータの共通点や違いを直感的に表現できます。例えば、複数の条件に当てはまるデータの抽出や、片方にしか存在しないデータの確認など、分析的な処理も分かりやすく書けます。これらの操作は、データ処理やプログラムの可読性を高める上で非常に有効です。
セットの特徴を活かしたシンプルなサンプル
ここで、セットの特徴をまとめて確認できる簡単な例を見てみましょう。重複を気にせず値を追加し、最終的に一意なデータだけを扱える流れを意識すると、セットの便利さが実感できます。
tags = ["Python", "基礎", "集合", "Python", "データ構造"]
unique_tags = set(tags)
unique_tags.add("学習")
このように、セットを使えば「同じ値が含まれていないこと」を前提に処理を進められるため、プログラムの意図が明確になります。リストやタプルとセットを適切に使い分けることで、コード全体の見通しも良くなり、保守しやすいプログラムを書くことができます。
生徒
「セットは順番がないのが最初は不安でしたが、重複を気にしなくていいのはすごく便利ですね。データ整理に向いている理由が分かりました。」
先生
「そうですね。順番が不要で、一意な値だけを扱いたい場面では、セットはとても強力な選択肢になります。」
生徒
「集合演算も、リストでやろうとすると大変そうな処理が、簡単に書けるのが印象的でした。」
先生
「その気づきは大切です。データ構造を正しく選ぶことで、プログラムは驚くほどシンプルになります。」
生徒
「これからは、重複をなくしたいときや比較をしたいときに、セットを積極的に使ってみます。」
先生
「ぜひ実践してみてください。リスト、タプル、セットを使い分けられるようになると、Pythonの理解が一段と深まりますよ。」