Pythonのセットの使いどころ!リストよりも高速な重複チェック
生徒
「Pythonでデータの中に同じものが入っているかを調べたいんですが、リストを使うと遅くなることはありますか?」
先生
「はい、データ量が多いとリストでの重複チェックは遅くなります。でも、set(セット)を使うととても高速にチェックできますよ。」
生徒
「セットって重複を自動で消すって聞いたことがありますが、それが速さにも関係あるんですか?」
先生
「そうです。セットは内部的に『ハッシュテーブル』という仕組みを使っていて、存在確認がとても速いんです。」
生徒
「じゃあリストよりもセットを使ったほうが効率的な場合があるんですね!」
1. リストでの重複チェックの仕組み
Pythonのリストは順番を持つデータ型で、重複も許されます。しかし、特定の値が含まれているかを確認するには、最初から最後まで順番に探す必要があります。そのため、データ量が多いと時間がかかります。
fruits_list = ["りんご", "みかん", "バナナ", "ぶどう"]
print("バナナ" in fruits_list) # True
この方法は小さなデータでは問題ありませんが、数十万件のデータでは速度に差が出ます。
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で大量データの重複チェックや検索を行うときは、まずセットを使うことを検討しましょう。