Pythonでリストの重複要素を削除・抽出する方法
Pythonでデータ処理を行う際、リスト内に重複する要素が含まれていることはよくあります。このような重複データは、集計や分析の際に問題となるため、正確な処理のために削除したり、あるいは抽出して確認したりする操作が必要になります。この記事では、Pythonのリストから重複要素を効率的に操作する様々な方法を、短いサンプルコードとともに解説します。
なぜ重複要素の処理が必要なのか?
重複要素の処理は、データクリーニングの基本的なステップの一つです。例えば、ユーザーIDのリストからユニークなユーザー数を数えたい場合や、商品の購入履歴から重複する商品を削除して表示したい場合など、様々なシナリオで重要になります。
Pythonでリストの重複要素を「削除」する方法
リストから重複した要素を取り除き、ユニークな要素だけを残す方法をいくつか紹介します。
1. set()を使う方法(最も簡潔)
Pythonの**set(集合)型**は、重複する要素を許さないデータ構造です。この特性を利用して、リストから簡単に重複を削除できます。
original_list = [1, 2, 2, 3, 4, 4, 5]
# setに変換して重複を削除し、再度リストに変換
unique_list = list(set(original_list))
print(unique_list)
# 出力例: [1, 2, 3, 4, 5] (順序は保証されない)
注意点: set()は要素の順序を保持しません。もし元のリストの順序を維持したい場合は、次の方法を検討してください。
2. リスト内包表記と順序保持のテクニック
元のリストの順序を保持したまま重複を削除したい場合は、一度出現した要素を記録しておく方法があります。
original_list = [1, 2, 2, 3, 4, 4, 5, 1]
seen = set()
unique_ordered_list = []
for item in original_list:
if item not in seen:
unique_ordered_list.append(item)
seen.add(item)
print(unique_ordered_list)
# 出力: [1, 2, 3, 4, 5]
この方法は、setを使って高速に要素の存在チェックを行いながら、リストに順序通り追加します。Python 3.7以降であれば、**dict.fromkeys()**を使うさらに簡潔な方法もあります(辞書のキーは重複を許さず、挿入順序を保持するため)。
original_list = [1, 2, 2, 3, 4, 4, 5, 1]
unique_ordered_list = list(dict.fromkeys(original_list))
print(unique_ordered_list)
# 出力: [1, 2, 3, 4, 5]
このdict.fromkeys()を使う方法は、Python 3.7以降で推奨される簡潔な方法です。
Pythonでリストの重複要素を「抽出」する方法
リストから重複している要素そのもの、または重複している要素の中から重複している要素を特定したい場合もあります。
1. collections.Counterを使う方法
リスト内の各要素の出現回数を数えるには、collectionsモジュールの**Counter**が非常に便利です。これを使えば、重複している要素(出現回数が1より大きい要素)を簡単に特定できます。
from collections import Counter
my_list = [1, 2, 2, 3, 4, 4, 4, 5, 6, 6]
# 各要素の出現回数をカウント
counts = Counter(my_list)
print(f"カウント結果: {counts}")
# 出力例: カウント結果: Counter({4: 3, 2: 2, 6: 2, 1: 1, 3: 1, 5: 1})
# 重複している要素を抽出(出現回数が1より大きいもの)
duplicate_elements = [item for item, count in counts.items() if count > 1]
print(f"重複している要素: {duplicate_elements}")
# 出力例: 重複している要素: [2, 4, 6]
2. ループとset()で重複要素を特定
set()を「既に出現した要素」と「重複が確認された要素」の2つを用意して、重複要素を特定することも可能です。
original_list = [1, 2, 2, 3, 4, 4, 5, 1]
seen = set()
duplicates = set() # 重複が確認された要素を保持するセット
for item in original_list:
if item in seen:
duplicates.add(item) # 既に出現していたら重複として追加
else:
seen.add(item) # 初めての出現ならseenに追加
print(f"重複している要素: {list(duplicates)}")
# 出力例: 重複している要素: [1, 2, 4] (順序は保証されない)
まとめ
Pythonでリストの重複要素を操作する方法は、目的(削除か抽出か、順序保持が必要か)によって最適なものが異なります。
重複削除(順序不問):
list(set(リスト))が最も簡潔。重複削除(順序保持):Python 3.7以降なら
list(dict.fromkeys(リスト))、それ以外はループとsetの組み合わせ。重複抽出:
collections.Counterを使うのが分かりやすく強力。手動でループとsetを組み合わせることも可能。
これらの方法を使いこなすことで、Pythonでのデータクリーニングや前処理が効率的かつ正確に行えるようになります。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

