🐍Python

Pythonでリストの重複を削除する方法(順序を保つ/保たない)

リストの重複を消す方法は、順序を保ちたいかで書き方が変わります。

順序を気にしない場合(set)

nums = [3, 1, 2, 3, 1]
result = list(set(nums))
# [1, 2, 3] ※順序は保証されない

順序を保ちたい場合(dict.fromkeys)

nums = [3, 1, 2, 3, 1]
result = list(dict.fromkeys(nums))
# [3, 1, 2] ※最初に出た順を保持

ポイント

  • set は最速だが順序はバラバラ。
  • dict.fromkeys はPython3.7以降で挿入順を保持でき、重複削除の定番。

よくある質問

set と dict.fromkeys どちらを使うべき?
順序がどうでもよければ set が簡単で高速です。元の並び順を保ちたいなら dict.fromkeys を使います。
リスト内に辞書など変更可能な要素があるときは?
set はハッシュ不可の要素を扱えません。その場合はループで『すでに見たか』を判定して追加する方法を使います。