Python Tips: リストから重複した要素を削除したい

Python で、リストから重複した要素を取り除き、ユニークな要素だけのリストを得る方法をご紹介します。

早速ですが、いちばんカンタンで Python らしい書き方は set を使うパターンでしょうか。

li = [3, 4, 3, 2, 5, 4]
li_uniq = list(set(li))  # [2, 3, 4, 5]

いったん set にしてからリストに戻すことで重複要素が自動的に削除されます。

ただしこの方法だと要素の順番が変わることもあるようです。要素の順番を保ちたい場合には、普通に for ループを回す形になります。

li = [3, 4, 3, 2, 5, 4]
li_uniq = []
for x in li:
    if x not in li_uniq:
        li_uniq.append(x)
li  # => [3, 4, 2, 5]

この「リストから重複を取り除く方法」について、 StackOverflow ではリスト内包表記を使ったアプローチや高速化する方法等が議論されています。たとえば、内包表記を使ってかつ高速化するひとつのアプローチとして、次のようなやり方が紹介されています。

def f7(seq):
    seen = set()
    seen_add = seen.add
    return [ x for x in seq if x not in seen and not seen_add(x)]

seen_add = seen.add あたりはオブジェクトのアトリビュート参照の時間も削減しようという試みでしょうか。要素の数が膨大になるような場合には効果を発揮するかもしれません。

参考