【Python】リストから重複要素を削除する5つの方法を徹底解説
リスト(List)はPythonにおける最も重要なデータ構造の一つであり、日常的なプログラミングからWeb開発まで、ほぼすべてのコードで利用されています。使用頻度が高い分、その操作をマスターすることへの需要も高く、各種操作に関する知識は必須といえます。
中でも「リストから重複要素を削除する」処理は、データの前処理やユニークな値の抽出など、数多くの場面で応用されるため、その実装方法を把握しておくと非常に役立ちます。
本記事では、Pythonでリストの重複を除去する代表的な5つの方法を、コード例と実行結果とともにわかりやすく解説します。
方法1:素朴な方法(forループ)
最も基本的なアプローチです。新しい空のリストを作成し、元のリストの要素を先頭から順に確認しながら、まだ含まれていない要素だけを追加していきます。ロジックが直感的で理解しやすいのが特徴です。
# 素朴な方法を使用
# リストの初期化
test_list = [1, 3, 5, 6, 3, 5, 6, 1]
print("元のリスト : " + str(test_list))
# forループで重複を除去
res = []
for i in test_list:
if i not in res:
res.append(i)
# 重複削除後のリストを出力
print("重複削除後のリスト : " + str(res))
方法2:リスト内包表記
方法1のロジックを1行で簡潔に書けるのがリスト内包表記です。コード量を抑えつつ、同じ処理を実現できます。
# リスト内包表記を使用
# リストの初期化
test_list = [1, 3, 5, 6, 3, 5, 6, 1]
print("元のリスト : " + str(test_list))
# リスト内包表記で重複を除去
res = []
[res.append(x) for x in test_list if x not in res]
# 重複削除後のリストを出力
print("重複削除後のリスト : " + str(res))
方法3:set() を使う
set()は重複を持たない集合型のため、リストをセットに変換してから再度リストに戻すことで、一発で重複を除去できます。
ただし元の順序は保持されない点に注意が必要です。
# set() を使用
# リストの初期化
test_list = [1, 5, 3, 6, 3, 5, 6, 1]
print("元のリスト : " + str(test_list))
# set() で重複を除去
test_list = list(set(test_list))
# 重複削除後のリストを出力
print("重複削除後のリスト : " + str(test_list))
方法4:リスト内包表記 + enumerate()
enumerate()でインデックスを取得しながら、「それより前の要素に同じ値が存在しない場合のみ残す」という条件でフィルタリングします。この方法では元の順序が保持されるのがメリットです。
# リスト内包表記 + enumerate() を使用
# リストの初期化
test_list = [1, 5, 3, 6, 3, 5, 6, 1]
print("元のリスト : " + str(test_list))
# enumerate() と組み合わせて重複を除去
res = [i for n, i in enumerate(test_list) if i not in test_list[:n]]
# 重複削除後のリストを出力
print("重複削除後のリスト : " + str(res))
方法5:collections.OrderedDict.fromkeys()
辞書のキーは重複できない性質を利用した方法です。OrderedDict.fromkeys()を使うことで、順序を保ちながら重複を除去できます。なお、Python 3.7以降では通常のdictも挿入順を保持するため、list(dict.fromkeys(test_list))でも同様の結果が得られます。
from collections import OrderedDict
# OrderedDict.fromkeys() を使用
# リストの初期化
test_list = [1, 5, 3, 6, 3, 5, 6, 1]
print("元のリスト : " + str(test_list))
# OrderedDict.fromkeys() で重複を除去
res = list(OrderedDict.fromkeys(test_list))
# 重複削除後のリストを出力
print("重複削除後のリスト : " + str(res))
実行結果
元のリスト : [1, 3, 5, 6, 3, 5, 6, 1] 重複削除後のリスト : [1, 3, 5, 6] 元のリスト : [1, 3, 5, 6, 3, 5, 6, 1] 重複削除後のリスト : [1, 3, 5, 6] 元のリスト : [1, 5, 3, 6, 3, 5, 6, 1] 重複削除後のリスト : [1, 3, 5, 6] 元のリスト : [1, 5, 3, 6, 3, 5, 6, 1] 重複削除後のリスト : [1, 5, 3, 6] 元のリスト : [1, 5, 3, 6, 3, 5, 6, 1] 重複削除後のリスト : [1, 5, 3, 6]
まとめ:使い分けのポイント
- 順序を気にせず高速に処理したい →
set()が最もシンプルかつ高速 - 元の順序を保持したい →
dict.fromkeys()やOrderedDict.fromkeys()がおすすめ - 可読性や学習目的を重視する → forループによる素朴な方法が理解しやすい
用途や要件に応じて適切な手法を選択することで、より効率的で保守性の高いコードを書くことができます。
-
Pythonでリストからオブジェクトを削除する方法|remove・del・popの違いと使い分け
Pythonでリストからオブジェクト(要素)を削除するには、主にremove()・del・pop()という3つの方法があります。それぞれ挙動が異なるため、目的に応じて使い分けることが重要です。 1. remove():値を指定して削除する remove()メソッドは、引数に指定した値に一致する最初の要素をリストから削除します。インデックスではなく値そのものを指定する点が特徴です。 使用例 a = [3, 2, 3, 2] a.remove(3) print(a) 実行結果 [2, 3, 2] この例では、最初に出現する「3」だけが削除され、2つ目の「3」はそのまま残ります。また、リスト
-
JavaでArrayListから重複要素を削除する方法【SetとStream API】
この記事では、JavaのArrayListから重複する要素を削除する方法を、具体的なコード例とともにわかりやすく解説します。代表的な2つのアプローチを紹介するので、目的や使用しているJavaのバージョンに応じて使い分けてください。 ArrayListから重複する文字列を削除する Setインターフェースには「重複した要素を保持できない」という特性があります。この特性を利用して、重複を含むArrayListを引数としてSetオブジェクトを生成すれば、手軽に重複を除去できます。 ポイントはLinkedHashSetを使うことです。通常のHashSetではなくLinkedHashSetを採用することで