Python - リスト内の重複している値を削除する

リスト内の順序が不定で良い場合は 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)
set() は 集合型の型コンストラクタ で、set型のオブジェクトを生成します。引数にリストなどのイテラブルオブジェクトを渡すと、その要素を元に初期化されます。

集合型は次のような特性を持ちます。

サンプルコード

次のサンプルコードは リストから 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以降では、辞書の追加順が保持されるため、辞書をリスト型に再変換することで、順序を保ちつつ重複値を削除したリストを得ることができます。

参考資料

検証環境

関連ページ

改訂履歴