Pythonリストから重複要素を削除する方法:順序保持と効率のバランス
リストは、整数、文字列、カスタムオブジェクトなどの順序付きコレクションを保持するPythonの基本データ構造です。他言語の配列に相当します。
以下に、順序と可読性を保ちながらリストから重複要素を削除する実証済みの手法を示します。
- setを使用して重複削除
- 一時リストを使用して重複削除
- OrderedDict(またはdict.fromkeys)を使用して重複削除
- シンプルなforループで重複削除
- リスト内包表記で重複削除
- NumPyのunique()で重複削除
- Pandasのunique()で重複削除
- enumerate()とリスト内包表記で重複削除
setを使用した重複削除
Pythonの組み込みset()関数は、一意な要素のみを返すことで重複を排除します。リストをセットに変換し、再びリストに戻すことでコレクション形式を維持します。
my_list = [1,1,2,3,2,2,4,5,6,2,1] my_final_list = set(my_list) print(list(my_final_list))
出力:
[1, 2, 3, 4, 5, 6]
一時リストを使用した重複削除
空のリストを作成し、元のリストをイテレーションして、未出現のアイテムのみを追加します。
my_list = [1, 2, 3, 1, 2, 4, 5, 4 ,6, 2]
print("List Before ", my_list)
temp_list = []
for i in my_list:
if i not in temp_list:
temp_list.append(i)
my_list = temp_list
print("List After removing duplicates ", my_list)
出力:
List Before [1, 2, 3, 1, 2, 4, 5, 4, 6, 2] List After removing duplicates [1, 2, 3, 4, 5, 6]
OrderedDict(またはdict.fromkeys)を使用した重複削除
Python 3.5以降では、通常のdictが挿入順を保持するため、dict.fromkeys()を使って順序を保ったまま一意な値を取得できます。
my_list = ['a','x','a','y','a','b','b','c'] my_final_list = dict.fromkeys(my_list) print(list(my_final_list))
出力:
['a', 'x', 'y', 'b', 'c']
シンプルなforループで重複削除
リストを走査し、未出現のアイテムのみを新しいリストに追加します。
my_list = [1,2,2,3,1,4,5,1,2,6]
myFinallist = []
for i in my_list:
if i not in myFinallist:
myFinallist.append(i)
print(myFinallist)
出力:
[1, 2, 3, 4, 5, 6]
リスト内包表記で重複削除
リスト内包表記で簡潔に記述しつつ可読性を維持できます。
my_list = [1,2,2,3,1,4,5,1,2,6] my_finallist = [] [my_finallist.append(n) for n in my_list if n not in my_finallist] print(my_finallist)
出力:
[1, 2, 3, 4, 5, 6]
NumPyのunique()で重複削除
NumPyのunique()関数は、配列のソート済み一意要素を返します。
import numpy as np my_list = [1,2,2,3,1,4,5,1,2,6] myFinalList = np.unique(my_list).tolist() print(myFinalList)
出力:
[1, 2, 3, 4, 5, 6]
Pandasのunique()で重複削除
同様に、Pandasもリストライクなオブジェクトで動作する軽量なunique()メソッドを提供します。
import pandas as pd my_list = [1,2,2,3,1,4,5,1,2,6] myFinalList = pd.unique(my_list).tolist() print(myFinalList)
出力:
[1, 2, 3, 4, 5, 6]
enumerate()とリスト内包表記で重複削除
enumerate()とリスト内包表記を組み合わせると、各要素の最初の出現を保持しつつ重複を削除できます。
my_list = [1,2,2,3,1,4,5,1,2,6] my_finallist = [i for j, i in enumerate(my_list) if i not in my_list[:j]] print(my_finallist)
出力:
[1, 2, 3, 4, 5, 6]
まとめ
set()は最速で重複を除去できるが、順序は保持されない。- 一時リストやforループは元の順序を保つが、やや冗長。
- 順序付き辞書や
dict.fromkeys()は順序を保ちつつ非常に効率的。 - NumPyとPandasは数値やDataFrame中心のワークフローでワンライナー解決を提供。
enumerate()を用いたリスト内包表記は、関数型スタイルで可読性が高く順序保持も可能。
Python
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python pass文完全マスター: 実践ガイド
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
- Python range()関数をマスター:基礎から応用まで
- Pythonリスト完全ガイド:追加、ソート、長さ、リスト内包表記(実践編)
- Pythonで平均を計算する:実践ガイド
- Python list.count() 完全ガイド:実践例付きで徹底解説
- Pythonリストから要素を削除する方法:remove()、pop()、clear()、del
- Python list.index():要素の位置を検索する実践ガイド
- Python リスト完全ガイド:作成、操作、メソッドのすべて