1. ホーム
  2. python

[解決済み] リストの順番を維持したまま、重複を削除するにはどうしたらいいですか?

2022-03-22 05:54:24

質問

Pythonのリストから、順序を維持したまま重複を削除するビルトインはありますか?私は、重複を削除するためにセットを使用することができることを知っているが、それは元の順序を破壊する。私はまた、このように自分自身をロールバックすることができることを知っています。

def uniq(input):
  output = []
  for x in input:
    if x not in output:
      output.append(x)
  return output

(ありがとうございます 巻き戻し そのために コードサンプル .)

でも、できればビルトインやもっとPythonicなイディオムを役立てたいですね。

関連する質問 Pythonでは、すべての要素が一意であるように、リストから重複を削除するための最速のアルゴリズムは何ですか? 順序を維持しながら ?

解決方法は?

ここでは、いくつかの選択肢をご紹介します。 http://www.peterbe.com/plog/uniqifiers-benchmark

最速の1枚。

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.addseen_add を呼び出すのではなく、単に seen.add ? Python は動的な言語であり、そのために seen.add は、ローカル変数を解決するよりもコストがかかります。 seen.add ランタイムはそれを除外できるほど賢くない。安全策を講じるために、毎回オブジェクトをチェックしなければならないのです。

もし、同じデータセットでこの関数を何度も使うつもりなら、順序付きセットの方がいいかもしれません。 http://code.activestate.com/recipes/528878/

O (1)1回の操作で挿入、削除、メンバーチェックを行う。

(小さな追記 seen.add() は常に None というように or は、セットの更新を試みる方法としてのみ存在し、論理テストの不可欠な部分としては存在しない)。