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つあります: duplicates
と unique_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
モジュールで duplicates
と unique_everseen
を利用する方法です。
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