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 などで高く評価されていますが、私は個人的に使わない。
fromkeys
は data
の要素を辞書のキーにして、新しい辞書をつくる。辞書のキーになりうるオブジェクトは __eq__
と __hash__
をサポートしている必要がありますが、リストはその条件を満たさない。だから
data = [['pen', 7], ['pen', 7], 1, 1, 1, 5]
result = list(dict.fromkeys(data))
# TypeError: unhashable type: 'list'
となる。リストは unhashable
で、辞書のキーは hashable
です。