順序を維持しながらリストから重複を削除するにはどうすればいいですか? 質問する

順序を維持しながらリストから重複を削除するにはどうすればいいですか? 質問する

順序を維持しながら、リストから重複を削除するにはどうすればよいですか? セットを使用して重複を削除すると、元の順序が破壊されます。組み込みまたは Python のイディオムはありますか?

ベストアンサー1

ここにいくつかの代替案があります:http://www.peterbe.com/plog/uniqifiers-benchmark

最速のもの:

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

なぜを呼び出すのではなく にseen.add割り当てるのでしょうか? Python は動的言語であり、各反復を解決するのはローカル変数を解決するよりもコストがかかります。 は反復間で変更される可能性があり、ランタイムはそれを排除できるほど賢くありません。安全を期すために、毎回オブジェクトをチェックする必要があります。seen_addseen.addseen.addseen.add

同じデータセットでこの関数を頻繁に使用する予定の場合は、順序付きセットを使用する方がよいでしょう。http://code.activestate.com/recipes/528878/

O(1)操作ごとに挿入、削除、メンバーチェック。

(小さな追加メモ:seen.add()は常に を返すためNoneor上記はセットの更新を試行する方法としてのみ存在し、論理テストの不可欠な部分として存在しているわけではありません。)

おすすめ記事