Python でリストの重複を見つける方法

Rayven Esplanada 2023年1月30日
  1. Python のリストから重複を削除するには set() 関数を使用する
  2. Python のリストで重複を見つけるための iteration_utils モジュールの利用
Python でリストの重複を見つける方法

このチュートリアルでは、Python でリスト内の重複を探す方法を紹介します。

Python のリストから重複を削除するには set() 関数を使用する

Python の set() はリストを集合に変換する関数です。集合とリストの説明からすると、リストを集合に変換するということは、リスト内の重複した要素をすべて削除することを意味します。

しかし、必要なのは、リスト内の重複する要素を検索することです。そのためには set() 関数を使いますが、リストに複数のエントリが含まれているものだけを対象にします。

リスト内の重複を探してセットとして保存する関数を宣言します。

def listToSet(listNums):
    set([num for num in listNums if listNums.count(x) > 1])

もう一つの方法は、結果をセットではなくリストとして保存したい場合、set()add() を使ってリスト内の重複を探し、リターン時にリストに変換し直すことです。

def list_duplicates(listNums):
    once = set()
    seenOnce = once.add
    twice = set(num for num in listNums if num in once or seenOnce(x))
    return list(twice)

この関数は、初めて番号が現れ、集合 once の中に存在しない場合に once にエントリを追加します。

どちらの関数も同じ出力を返しますが、一方は集合であり、もう一方はリストです。結果は listNums の重複エントリをすべて出力します。

[1, 3, 5, 8]

Python のリストで重複を見つけるための iteration_utils モジュールの利用

iteration_utils には、あらかじめ定義された関数内の重複を検索するための関数が 2つあります: duplicatesunique_everseen です。

ここでは上記のリスト定義 listNums と同じものを使用することにします。

iteration_utils から duplicates をインポートし、listNums 内のすべての重複のリストを返すために利用します。

from iteration_utils import duplicates

listNums = [1, 1, 2, 3, 3, 4, 5, 5, 5, 5, 6, 8, 8]


def listDups(listNums):
    return list(duplicates(listNums))

上記の関数の出力は listNums 内のすべての重複エントリのリストを返します。

[1, 1, 3, 3, 5, 5, 5, 5, 8, 8]

しかし、リストには重複エントリの繰り返しも含まれます。つまり、重複したエントリのすべてのインスタンスを返します。

  • そこで unique_everseen の出番です。この関数はリストを処理して duplicates() が返す重複したインスタンスをすべて削除します。
from iteration_utils import duplicates
from iteration_utils import unique_everseen

listNums = [1, 1, 2, 3, 3, 4, 5, 5, 5, 5, 6, 8, 8]


def listDupsUnique(listNums):
    return list(unique_everseen(duplicates(listNums)))

この関数は次を返します:

[1, 3, 5, 8]

要約すると、Python でリスト内の重複を探すには 2つの簡単な方法があります。1つ目は、set() やその他の Python のセットのユーティリティ関数を使って重複を探し、別の変数に格納する方法です。もう一つは iteration_utils モジュールで duplicatesunique_everseen を利用する方法です。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

関連記事 - Python List