環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Python のリストから重複を除く:dict.fromkeys を使う方法はリストのリストに通用しない

最終更新日 2023.02.18

Python のリストから重複を除くコード:

data = [3, 3, 1, 1, 1, 5]

result = []

for item in data:
    if item in result:
        pass
    else:
        result.append(item)

print(result)  # [3, 1, 5]

この単純な方法は、リストを含むリストでもうまくいく。

data = [['pen', 7], ['pen', 7], 1, 1, 1, 5]

result = []

for item in data:
    if item in result:
        pass
    else:
        result.append(item)

print(result)  # [['pen', 7], 1, 5]

dict.fromkeys を使う方法

data = ['pen', 'pen', 1, 1, 1, 5]

result = list(dict.fromkeys(data))

print(result)  # ['pen', 1, 5]

dict.fromkeys を使った方法は Stack Overflow などで高く評価されていますが、私は個人的に使わない。

fromkeysdata の要素を辞書のキーにして、新しい辞書をつくる。辞書のキーになりうるオブジェクトは __eq____hash__ をサポートしている必要がありますが、リストはその条件を満たさない。だから

data = [['pen', 7], ['pen', 7], 1, 1, 1, 5]

result = list(dict.fromkeys(data))

# TypeError: unhashable type: 'list'

となる。リストは unhashable で、辞書のキーは hashable です。