順序を維持しながら、リストから重複を削除するにはどうすればよいですか? セットを使用して重複を削除すると、元の順序が破壊されます。組み込みまたは 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_add
seen.add
seen.add
seen.add
同じデータセットでこの関数を頻繁に使用する予定の場合は、順序付きセットを使用する方がよいでしょう。http://code.activestate.com/recipes/528878/
O(1)操作ごとに挿入、削除、メンバーチェック。
(小さな追加メモ:seen.add()
は常に を返すためNone
、or
上記はセットの更新を試行する方法としてのみ存在し、論理テストの不可欠な部分として存在しているわけではありません。)