2013/11/30

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 あたりはオブジェクトのアトリビュート参照の時間も削減しよう、という試みでしょうか。


参考
Get unique values from a list in python - StackOverflow
In Python, what is the fastest algorithm for removing duplicates from a list so that all elements are unique *while preserving order*? - StackOverflow
How do you remove duplicates from a list in Python whilst preserving order? - StackOverflow

0 件のコメント: