🐍Python

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

Pythonでリストから重複を取り除く方法は、「順序を保つか・保たないか」で書き方が変わります。手軽なsetは順序が崩れることがあるので注意。2つの方法を使い分けられるようにしましょう。

lst = [3, 1, 2, 1, 3]
# 順序を保たない(最速・簡単)
unique = list(set(lst))
# 順序を保つ
unique_ordered = list(dict.fromkeys(lst))
方法順序
list(set(lst))保たれない(崩れることがある)
list(dict.fromkeys(lst))元の順序を保つ

順序を保たない方法

とにかく重複を消したいときに手軽です。

set を使う
list(set(lst)) が最も簡単。setは重複を持たないため、これだけで重複が消えます。
順序は保証されない
setは順序を保持しないため、元の並び順が変わることがあります。順序が重要なら別の方法を。
コツ:順序がどうでもよければlist(set(lst))が一番手軽。順序を保ちたいならlist(dict.fromkeys(lst))を使う、と覚えておけば使い分けられます。

順序を保つ方法

元の並びを維持したいときの定番です。

  • dict.fromkeys…キーの重複が消える性質を利用する。
  • 順序が保たれる…辞書は挿入順を保つため、元の並びが維持される。
  • list()で戻す…結果を list() で囲んでリストに戻す。
注意:setは手軽ですが順序が変わる可能性があります。「重複は消したいが並び順は守りたい」場合にsetを使うと、意図せず順番が崩れることに。その場合はdict.fromkeysを使いましょう。

あわせて読みたい:Pythonで辞書を値(value)でソートする方法SQLで重複行を除いて取得する方法(DISTINCT)Pythonの記事一覧

まとめ

Pythonのリスト重複削除は順序不要なら list(set(lst))、順序を保つなら list(dict.fromkeys(lst))を使い分けます。setは手軽ですが順序が崩れることがあるため、並び順が大事なときはdict.fromkeysが安全。用途に応じて選びましょう。

よくある質問

Pythonでリストの重複を削除するには?
順序を気にしなければ list(set(lst)) が最も手軽です。元の並び順を保ちたい場合は list(dict.fromkeys(lst)) を使います。
set を使うと順序はどうなる?
保証されません。setは順序を保持しないため、重複は消えても元の並び順が変わることがあります。順序が重要なら別の方法を使いましょう。
順序を保って重複を消すには?
list(dict.fromkeys(lst)) を使います。辞書はキーの重複を持たず挿入順を保つため、元の並び順を維持したまま重複を削除できます。
どちらの方法を使えばいい?
並び順がどうでもよければ手軽な list(set(lst))、並び順を守りたいなら list(dict.fromkeys(lst)) です。用途に応じて使い分けましょう。