Introduction
ここにPythonの配列
>>> script = ['Python', 'Ruby', 'Perl', 'Python', 'JavaScript']
あります。ここから順番は守りつつ、重複を削除したい場合、どのようなスクリプトが必要でしょうか、というのが今回のお題です。今回の場合、最終的に['Python', 'Ruby', 'Perl', 'JavaScript']というリストを得るのが目的です。
重複を取り除くならsetを使えばよいのでは?
setは集合演算を行うことができるデータ型です。listをset型に変換したい場合は以下のようにset関数を用います。
>>> set(script)
実行結果は以下のようになります。
{'Perl', 'Python', 'JavaScript', 'Ruby'}
setは集合演算を行うデータ型であるため、順番を気にしません。よってset関数のみでは、重複を取り除くところまでしか達成できません。
set + sorted、そしてkey=.index
ズバリ答えを言ってしまうとsorted関数を使います。ただし、sorted関数の引数であるkeyに.index()を指定するのが、今回の味噌です。
.index()は引数に指定したものが、どの要素にいるかを前方一致で返します。つまり'Python'の文字列の場合には
>>> script.index('Python')
0
のように左から検索して最初に出くわした要素数である0を返します。これをsorted関数のkeyに選択してあげます。
最終的なスクリプトと、その出力結果は以下のようになります。
>>> sorted(set(script), key=script.index)
['Python', 'Ruby', 'Perl', 'JavaScript']
期待通りの結果を得ることができました。