Pythonでリストに重複要素があるか判定する効率的な方法


Pythonでデータを扱う際、リスト(配列)の中に重複した要素が含まれているかどうかを判定したい場面はよくあります。データの整合性チェックや、後続の処理の分岐など、様々なシナリオでこの判定が必要となります。この記事では、Pythonのリストに重複要素が存在するかどうかを効率的にチェックする複数の方法を、短いサンプルコードとともに解説します。

なぜリストの重複チェックが必要なのか?

リストの重複チェックは、データ前処理やバリデーションの重要なステップです。例えば、ユーザーIDの一覧に同じIDが複数登録されていないか、設定ファイルに同じキーが重複して記述されていないかなどを確認することで、予期せぬエラーや誤動作を防ぐことができます。


Pythonでリストの重複を判定する方法

Pythonのリストに重複要素があるかどうかを判定するには、主に以下の方法があります。

1. set()のサイズを比較する方法(最も簡潔で高速)

Pythonの**set(集合)型**は、重複する要素を許さない特性を持っています。この特性を利用すると、元のリストとsetに変換した後の要素数を比較することで、簡単に重複の有無を判定できます。もし要素数が異なれば、重複が存在するということです。

Python
 
my_list_has_duplicates = [1, 2, 2, 3, 4]
my_list_no_duplicates = [1, 2, 3, 4, 5]

# 重複があるか判定
has_duplicates = len(my_list_has_duplicates) != len(set(my_list_has_duplicates))
print(f"[{my_list_has_duplicates}] に重複はありますか?: {has_duplicates}")
# 出力: [1, 2, 2, 3, 4] に重複はありますか?: True

has_duplicates = len(my_list_no_duplicates) != len(set(my_list_no_duplicates))
print(f"[{my_list_no_duplicates}] に重複はありますか?: {has_duplicates}")
# 出力: [1, 2, 3, 4, 5] に重複はありますか?: False

この方法は非常に簡潔で高速であり、ほとんどの場合で推奨されるアプローチです。ただし、リストの要素がハッシュ可能(変更不可能で、ハッシュ値が計算できる型、例:数値、文字列、タプルなど)である必要があります。リストや辞書など、変更可能なオブジェクトを含むリストには直接適用できません。

2. ループとset()を使って確認する方法

要素の型がハッシュ可能でない場合や、より明示的に重複要素を見つけたい場合は、ループとsetを組み合わせて確認する方法もあります。

Python
 
def check_for_duplicates(input_list):
    seen = set()
    for item in input_list:
        if item in seen:
            return True  # 重複が見つかったら即座にTrueを返す
        seen.add(item)
    return False # 重複が見つからなかったらFalseを返す

list_with_duplicates = [1, 2, 2, 3, 4]
list_without_duplicates = [1, 2, 3, 4, 5]

print(f"[{list_with_duplicates}] に重複はありますか?: {check_for_duplicates(list_with_duplicates)}")
# 出力: [1, 2, 2, 3, 4] に重複はありますか?: True

print(f"[{list_without_duplicates}] に重複はありますか?: {check_for_duplicates(list_without_duplicates)}")
# 出力: [1, 2, 3, 4, 5] に重複はありますか?: False

この方法は、set()の高速な要素検索を利用しつつ、最初の重複が見つかった時点で処理を終了するため効率的です。

3. collections.Counterを使う方法

collectionsモジュールの**Counter**は、リスト内の各要素の出現回数をカウントするために使われます。これを利用して、出現回数が1より大きい要素が存在するかどうかをチェックすることで、重複の有無を判定できます。

Python
 
from collections import Counter

my_list_has_duplicates = [1, 2, 2, 3, 4]
my_list_no_duplicates = [1, 2, 3, 4, 5]

# 各要素の出現回数をカウント
counts_has_duplicates = Counter(my_list_has_duplicates)
# 最も出現回数が多い要素のカウントが1より大きければ重複あり
has_duplicates_counter = any(count > 1 for count in counts_has_duplicates.values())
print(f"[{my_list_has_duplicates}] に重複はありますか?: {has_duplicates_counter}")
# 出力: [1, 2, 2, 3, 4] に重複はありますか?: True

counts_no_duplicates = Counter(my_list_no_duplicates)
has_duplicates_counter = any(count > 1 for count in counts_no_duplicates.values())
print(f"[{my_list_no_duplicates}] に重複はありますか?: {has_duplicates_counter}")
# 出力: [1, 2, 3, 4, 5] に重複はありますか?: False

この方法は、各要素の出現頻度も同時に知りたい場合に特に便利です。


まとめ

Pythonでリストに重複要素があるか判定する方法はいくつかありますが、状況に応じて最適な方法を選ぶことが重要です。

  • 最も簡潔で高速に判定したい場合は、len(リスト) != len(set(リスト)) を使う方法がおすすめです。ただし、要素がハッシュ可能である必要があります。

  • 要素の型に制約がある場合や、重複の特定処理をカスタマイズしたい場合は、ループとset()を組み合わせる方法が有効です。

  • 各要素の出現回数も同時に知りたい場合は、**collections.Counter**が非常に便利です。

これらのテクニックを使いこなすことで、Pythonでのデータ検証や処理の効率を向上させることができます。

らくらくPython塾 – 読むだけでマスター

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座