Pythonのセットの使いどころ!リストよりも高速な重複チェック
生徒
「Pythonでデータの中に同じものが入っているかを調べたいんですが、リストを使うと遅くなることはありますか?」
先生
「はい、データ量が多いとリストでの重複チェックは遅くなります。でも、set(セット)を使うととても高速にチェックできますよ。」
生徒
「セットって重複を自動で消すって聞いたことがありますが、それが速さにも関係あるんですか?」
先生
「そうです。セットは内部的に『ハッシュテーブル』という仕組みを使っていて、存在確認がとても速いんです。」
生徒
「じゃあリストよりもセットを使ったほうが効率的な場合があるんですね!」
1. リスト(list)による重複チェックの仕組みと注意点
Pythonのリスト(list)は、複数のデータを順番に並べて管理する、最も基本的なデータ型の一つです。リストには「同じ値を何度でも入れられる」という特徴がありますが、特定の値が含まれているかを確認する(存在確認)際には注意が必要です。
リストの検索は、中身を端から順番に一つずつ確認していく「線形探索」という仕組みで行われます。たとえば、100個のデータが入った箱の中から1つの名前を探すとき、最悪の場合は100回中身を確認しなければなりません。
# プログラミング未経験でもわかるリスト検索の例
# 好きなフルーツのリスト
fruits_list = ["りんご", "みかん", "バナナ", "ぶどう", "いちご"]
# 「バナナ」がリストの中にあるか探す
if "バナナ" in fruits_list:
print("バナナは見つかりました!")
else:
print("リストには入っていません。")
このコードは、Pythonが裏側で「1番目はりんご?違う、2番目はみかん?違う、3番目は…」と順番にチェックしています。データが数個〜数百個程度なら一瞬ですが、これが数万、数十万件という膨大なデータ量になると、探す手間が積み重なり、プログラム全体の動作が目に見えて遅くなってしまいます。
「とりあえずリストを使えばいい」と考えがちですが、データの重複チェックや検索を頻繁に行うシステムを開発する上では、この「検索コスト」がパフォーマンスのボトルネックになることを覚えておきましょう。
2. セットでの高速な重複チェック
セットは順番を持たない代わりに、重複を許さず、要素の存在確認が非常に高速です。内部でハッシュテーブルという構造を使っており、値の検索はほぼ一瞬で終わります。
fruits_set = {"りんご", "みかん", "バナナ", "ぶどう"}
print("バナナ" in fruits_set) # True
同じデータ量でも、セットを使うとリストよりもはるかに速く存在確認ができます。
3. 実際の速度比較
簡単な速度比較をしてみましょう。1〜100万までの数字を使って、リストとセットの存在確認にかかる時間を比べます。
import time
data_list = list(range(1_000_000))
data_set = set(range(1_000_000))
# リスト検索
start = time.time()
999_999 in data_list
print("リスト検索時間:", time.time() - start)
# セット検索
start = time.time()
999_999 in data_set
print("セット検索時間:", time.time() - start)
実行すると、セットのほうが圧倒的に速いことがわかります。
4. 重複をなくす用途
セットは重複を自動で取り除く性質があるため、データから重複を削除する場合にも便利です。
fruits_list = ["りんご", "みかん", "バナナ", "りんご"]
unique_fruits = set(fruits_list)
print(unique_fruits)
{'バナナ', 'みかん', 'りんご'}
このように変換するだけで、重複が自動的に消えます。
5. 応用例:会員登録の重複チェック
例えば、メールアドレスが既に登録されているか確認する場合、セットを使えば高速に判定できます。
registered_emails = {"user1@example.com", "user2@example.com"}
new_email = "user3@example.com"
if new_email in registered_emails:
print("すでに登録されています")
else:
print("登録可能です")
6. 初心者が覚えるべきポイント
- リストは順番を持つが、検索は遅くなる場合がある
- セットは順番を持たないが、検索や重複チェックが高速
- 内部構造がハッシュテーブルなので検索速度が安定して速い
- 重複削除や存在確認に特に向いている
Pythonで大量データの重複チェックや検索を行うときは、まずセットを使うことを検討しましょう。