リスト内の順序が不定で良い場合は set型 を使用するのが最も高速です。順序を維持したい場合は set型 へ変換後に再度ソートするか、dict型 に変換してから再度リスト型に変換する方法があります。
重複データを削除する方法
順不同でよい場合
# set型のままで良い場合
valueSet = set([0, 0, 1, 1])
# 結果 = {0, 1}
print(valueSet)
# リスト型に戻したい場合
valueList = list(set([0, 0, 1, 1]))
# 結果 = [0, 1] または [1, 0]
print(valueList)
順序を維持したい場合
# データ件数が多い場合、効率が悪い
valueList = [0, 0, 1, 1]
valueList = sorted(set(valueList), key=valueList.index)
# 結果 = [0, 1]
print(valueList)
# Pythonバージョン3.7以降のみ
valueList = list(dict.fromkeys([0, 0, 1, 1]))
# 結果 = [0, 1]
print(valueList)
解説(setを使用)
valueSet = set([0, 0, 1, 1])
# 結果 = {0, 1}
print(valueSet)
集合型は次のような特性を持ちます。
- addメソッドを使用して要素を追加できます。既に存在する値を追加した場合は何もしません。
- for文などを使用してループ処理を行うことができます。ただし順序を持たないため、取り出される順序は保証されません。
サンプルコード
次のサンプルコードは リストから set型 のオブジェクトを作成し、重複データを削除しています。 その後 addメソッドを使用して 値を追加していますが既に存在するため、追加されません。 最後に forループを使用して要素を出力します。# リストから集合型のオブジェクトを生成。重複しないため、1 と 0 の2要素のみ。
valueSet = set([1, 1, 0, 0])
# 1 と 0 を追加しているが重複するため、追加されない
valueSet.add(1)
valueSet.add(0)
# for ループを使用して内容を確認
for value in valueSet:
# 1 と 0 が一度ずつ出力される。出力順は不定。
print(value)
解説(set + list を使用)
valueList = list(set([0, 0, 1, 1]))
# 結果 = [0, 1] または [1, 0]
print(valueList)
リストを set型 に変換することで重複値を削除し、再び list型 に変換します。
list() は リスト型 の 型コンストラクタ で、引数にリストなどのイテラブル・オブジェクトを渡すと、その要素を元に新しいリストを生成します。
この方法では順序は維持されません。
解説(sorted と set を使用)
valueList = [0, 0, 1, 1]
valueList = sorted(set(valueList), key=valueList.index)
# 結果 = [0, 1]
print(valueList)
sorted 関数 は イテラブル・オブジェクト(list型やset型など) をソートし、その結果を新たなリストとして返します。引数 key に 関数を指定すると、その関数を用いてソートの順序を決定します。
index は リスト型のメソッド(関数) で、引数に指定した値がリスト内で何番目に位置するかを返します。
この方法はリストの要素数分 indexメソッド が呼ばれるため、要素数が多いと効率が悪くなる可能性があります。
解説(dict.fromkeys を使用)
valueList = list(dict.fromkeys([0, 0, 1, 1]))
# 結果 = [0, 1]
print(valueList)
dict.fromkeysは辞書型のクラスメソッドで、指定されたイテラブルオブジェクト(list型やset型など)の値をキーとし、新しい辞書を返します。辞書のキーは重複しないため、この方法で重複値を削除できます。
Pythonバージョン3.7以降では、辞書の追加順が保持されるため、辞書をリスト型に再変換することで、順序を保ちつつ重複値を削除したリストを得ることができます。
参考資料
- Python公式ドキュメント - リスト型 (list)
- Python公式ドキュメント - set(集合)型
- Python公式ドキュメント - 集合型
- Python公式ドキュメント - sorted -- 組み込み関数
- Python公式ドキュメント - マッピング型 -- dict
- Python公式ドキュメント - fromkeys -- dict
検証環境
- Python 3.11.3 (tags/v3.11.3:f3909b8, Apr 4 2023, 23:49:59) [MSC v.1934 64 bit (AMD64)] on win32
- Windows 10 Enterprise Version 22H2 OS Build 19045.3930 Experience: Windows Feature Experience Pack 1000.19053.1000.0