Python でリストを重複排除する方法
Python には時々値のリストがあり、その中のいくつかは重複しています。
リストからすべての重複を削除するのは日常的な使用例であるため、
リスト内の残りの値はすべて一意です。
さまざまな方法を使用してこれを達成できます。
元の要素の順序とそうでない要素。
順序を維持せずに Python リストを重複排除する
元の順序を保持する必要がない場合は、
組み込みの set
データ構造を使用してリストを重複排除できます。
set
は、設計上一意の要素のみを含むデータ構造です。
初期リストからこのような set
を構築することにより、すべての重複要素
無視されます。
次に、セットをリストに戻すと、一意の要素のリストが取得されます。
残念ながら、重複排除のため、要素の順序が変更されます
set
データ構造の機能は、ハッシュテーブルを使用して実装されます。
どの要素が最初に挿入されたか覚えていません。
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique_set = set(names)
>>> unique_list = list(unique_set)
>>> unique_list
['Stacy', 'Sarah', 'Jim', 'Bob']
Python で科学計算に NumPy パッケージを使用する場合、
numpy.unique()
関数を使用することもできます。
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> numpy.unique(names).tolist()
['Bob', 'Jim', 'Sarah', 'Stacy']
上記のメソッドは元の要素の順序も保持しないことに注意してください。
順序を維持する NumPy
の方法はより複雑で、以下で見つけることができます。
順序を維持した Python リストの重複排除
初期順序を保持できる単純なソリューションは、二重 for-each ループを使用することです。
最初のループは、元のリストのすべての要素を横断します。
2 番目のループは、同じ値を持つ要素が既にあるかどうかを確認します。
そうでない場合は、それを一意の
リストに追加します。最後に、
元の順序で一意の要素が含まれます。
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = []
>>> for name in names: # 1st loop
... if name not in unique: # 2nd loop
... unique.append(name)
...
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
元の順序を維持しながらリストを重複排除する別の方法は、
collections.OrderedDict
データ構造。
OrderedDict
は Python の特別な種類の辞書データ構造です。
キー挿入の順序を記憶します。
>>> from collections import OrderedDict
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = list(OrderedDict.fromkeys(names))
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
Pandas Python データ分析ライブラリを使用する場合、
pandas.unique
も役立つかもしれません。このメソッドは順序を保持します。
>>> import pandas
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> pandas.unique(names).tolist()
['Bob', 'Stacy', 'Sarah', 'Jim']
順序を維持しながらリストを重複排除する NumPy の方法は、もう少し複雑です。
各個別の要素のインデックスを覚えてから、一意のリストを再作成する必要があります
そのようなインデックスを使用する元のものから。
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> _, indexes = numpy.unique(names, return_index=True)
>>> unique = [names[i] for i in numpy.sort(indexes)]
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']