Pythonのセットが便利!リストより高速な重複排除テクニックをやさしく解説
生徒
「先生、Pythonでリストに同じデータがたくさんあって、重複を取り除きたいんですけど、どうすればいいですか?」
先生
「それならPythonのセット(set)を使うのがとても便利ですよ。セットは重複しないデータの集まりなので、重複排除が簡単にできます。」
生徒
「セットってリストと何が違うんですか?なぜ重複排除に向いているんですか?」
先生
「セットは数学の集合のようなもので、同じデータを一つだけ持つ特徴があります。また、セットは内部で高速に重複をチェックしているので、リストよりも重複を取り除く処理が速いんです。」
生徒
「それはすごいですね!具体的にどうやって使うんですか?」
先生
「では、基本の使い方を見ていきましょう!」
1. Pythonのセット(set)とは?
セットは、重複しないデータだけを集めたものです。例えば、「りんご」「みかん」「りんご」というデータがあっても、セットにすると「りんご」と「みかん」が一つずつだけ残ります。
リストは順番を持ち、同じデータも何度も入れられますが、セットは順番を持たず、重複したデータは一つにまとめられます。
fruits_list = ["りんご", "みかん", "りんご", "バナナ", "みかん"]
fruits_set = set(fruits_list)
print(fruits_set) # {'みかん', 'りんご', 'バナナ'}
このようにリストからセットに変換するだけで重複がなくなります。
2. なぜセットはリストより高速に重複を排除できるのか?
セットは内部的に「ハッシュテーブル」という仕組みを使っています。これは、データの存在を素早く調べるための特別な構造です。
一方リストは順番にデータを探すため、重複チェックに時間がかかり、大量のデータでは処理が遅くなります。
そのため、重複排除をするならセットを使うと効率的で速い結果が得られます。
3. 実際にリストで重複排除をする例とセットを使った例の違い
まずリストで重複を取り除くには、以下のようなコードを書きます。
fruits_list = ["りんご", "みかん", "りんご", "バナナ", "みかん"]
unique_fruits = []
for fruit in fruits_list:
if fruit not in unique_fruits:
unique_fruits.append(fruit)
print(unique_fruits) # ['りんご', 'みかん', 'バナナ']
この方法でも重複排除はできますが、リストが大きくなると処理が遅くなります。
次にセットを使うと、とても簡単で速くなります。
fruits_list = ["りんご", "みかん", "りんご", "バナナ", "みかん"]
unique_fruits_set = set(fruits_list)
print(unique_fruits_set) # {'みかん', 'りんご', 'バナナ'}
4. セットからリストに戻す方法
セットは順番を持たないため、必要に応じて順番付きのリストに変換できます。
unique_fruits_list = list(unique_fruits_set)
print(unique_fruits_list) # ['みかん', 'りんご', 'バナナ']
こうすると重複を取り除いたリストとして扱えますが、順番は元のリストとは変わることがあります。
5. 実践!大量データでの重複排除の速さを比較してみよう
ここでは数万件のデータでリストとセットの処理速度を比べてみます。
import time
data = ["apple"] * 30000 + ["banana"] * 30000 + ["orange"] * 30000
# リストで重複排除
start = time.time()
unique_list = []
for item in data:
if item not in unique_list:
unique_list.append(item)
end = time.time()
print("リストの処理時間:", end - start)
# セットで重複排除
start = time.time()
unique_set = set(data)
end = time.time()
print("セットの処理時間:", end - start)
結果は環境によりますが、セットの方が圧倒的に速いことが多いです。大量データの重複排除ではセットを使うのが基本です。
6. セットの注意点:順序を保持しないこと
セットは重複排除に便利ですが、要素の順序を保持しません。
もし元の順序を保ちながら重複を取り除きたい場合は、別の工夫が必要です。
Python 3.7以降では辞書のキーの順序が保持されるので、dict.fromkeys()を使う方法もありますが、今回はセットの高速重複排除に集中しましょう。
7. ポイントおさらい
Pythonのセットはリストよりも高速に重複を排除できる便利なデータ型です。
重複排除したいときは、リストからセットに変換するだけで簡単に実現できます。
ただし、セットは順序を保持しないので、順番が大事なときは別の方法を検討してください。
まとめ
この記事では、Pythonにおけるセット(set)の特徴と、リストと比較したときの高速な重複排除テクニックについて詳しく学びました。 Pythonのセットは、数学の集合と同じ考え方を持つデータ構造で、重複する要素を自動的に排除するという大きな特徴があります。 この性質により、リストでは手間と時間がかかりがちな重複チェックや重複削除の処理を、非常にシンプルかつ高速に実現できます。
特に重要なのは、セットが内部でハッシュテーブルという仕組みを使っている点です。 これにより、要素がすでに存在するかどうかの判定が高速に行われ、大量のデータを扱う場合でもパフォーマンスが落ちにくくなります。 記事内で紹介したように、数万件規模のデータでは、リストによる重複排除と比べて、セットを使った方法が圧倒的に速くなるケースも多く見られます。 Pythonでデータ処理や前処理を行う際、この違いを理解しておくことはとても重要です。
また、セットは順序を持たないという性質も持っています。 これはメリットでもあり、注意点でもあります。 重複排除だけが目的であれば問題ありませんが、「元の順番を保ちたい」という要件がある場合には、そのままセットを使うと意図しない結果になることがあります。 そのような場合は、セットで一度重複を排除したあとにリストへ変換したり、別のデータ構造と組み合わせて使うなど、目的に応じた工夫が必要です。
Pythonのセットは、重複排除だけでなく、集合演算(和集合・積集合・差集合)や、存在チェックの高速化など、さまざまな場面で活躍します。 今回の記事を通して、リストとセットの違いを正しく理解し、「どんな場面でセットを使うべきか」を判断できるようになることが大切です。 初心者のうちはリストばかり使ってしまいがちですが、データの性質に注目してセットを選択できるようになると、Pythonのコードは一段と洗練されていきます。
重複排除の基本コードをもう一度確認
ここで、Pythonのセットを使った重複排除の基本コードをあらためて振り返ってみましょう。 リストからセットに変換するだけで、重複が自動的に削除される点が最大の魅力です。
data_list = ["赤", "青", "赤", "緑", "青", "黄"]
# セットで重複排除
unique_set = set(data_list)
# 必要に応じてリストに戻す
unique_list = list(unique_set)
print(unique_set)
print(unique_list)
このように、Pythonのセットを使えば、コード量を増やすことなく、可読性と処理速度の両方を向上させることができます。 データ数が増えれば増えるほど、その効果はより実感できるでしょう。
生徒
「今日の記事で、Pythonのセットがどうして重複排除に向いているのか、よく分かりました。 リストで一つずつチェックするより、セットに変換するだけでいいのは便利ですね。」
先生
「その通りです。特にデータ量が多くなるほど、セットの強みがはっきり見えてきます。 Pythonでは『何をしたいか』に合わせてデータ構造を選ぶことがとても大切なんですよ。」
生徒
「でも、順番が必要なときは注意しないといけないんですよね? セットは順番を持たないっていうのも覚えておきます。」
先生
「素晴らしいポイントです。重複排除が目的ならセット、順序が重要なら別の方法、 というように使い分けができると、Pythonの理解が一段階レベルアップします。」
生徒
「これからは、重複データを見たら『セットが使えるかも』って考えてみます! Pythonのコードを書くのが、少し楽しくなってきました。」
先生
「その意識がとても大切です。ぜひ実際のプログラムでも、セットを積極的に使ってみてください。」