Rubyのuniq()をpythonで再現するなら

id:atsuoishimoto さんの uniq()あれこれ - atsuoishimotoの日記 という記事を読み、そのまたリンク先記事やコメント欄を読ませてもらいました。僕はRubyはほとんど知らないのでuniqメソッドについても記事のはじめのほうでは「set()じゃだめなのかな?」とか思ったのですが、リストの順序が勝手にソートされるのは困るとのこと。そこで以前こんなことをつぶやいてたのを思い出しました。

Pythonのsorted関数はこのように定義されています。

sorted(iterable, cmp=None, key=None, reverse=False)

リストの要素に対して呼び出される関数を指定するkeyパラメータ

sortedはソート対象以外にもいくつか引数を取れるんですが、keyパラメータは、リストの要素に対して呼び出される関数を指定することが可能です。これを利用して、以下のようにすると重複を取り除いた、且つ順序も維持したリストが得られます。

l = [3, 6, 1, 3, 5, 2, 7, 6]
sorted(set(l), key=l.index)
#[3, 6, 1, 5, 2, 7]


とまあ記事書いといてなんですが、sortedなんて名前の関数を呼び出してるのにソートされてないはPythonicじゃないなーと思います。なので、やはり僕もatsuoishimotoさんが最後に上げてるコードが一番いいのかなと思ったのでした。