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)) です。用途に応じて使い分けましょう。