さるへい備忘録

さるへいのやったことを綴っているブログです。基本的にテクノロジーの話題です。

Pythonでlistをsetで重複排除してソート

Pythonでsetを使う際にいろいろ困ったのでこちらに備忘録を残します。

setとは?

集合を扱うための仕組み。
公式ドキュメントは以下です。

docs.python.org

特徴としては、list みたいな感じだけど重複除去されているということです。

item = set()
item.add(1)
item.add(2)
item.add(3)
item
-> {1, 2, 3}
item.add(1)
item
-> {1, 2, 3}

また、普通の set はミュータブルですが、イミュータブルな frozenset も用意されています。

listの重複を排除

さて、発端としては僕がlistの重複を排除しようとしたことです。

さて、実行してみましょう。

set(["あ", "い", "う", "え", "お", "あ"])
-> {'い', 'お', 'う', 'え', 'あ'}

見事重複が排除されました!
しかしよく見ると、順番がぐちゃぐちゃです。

そうなんです。listをsetにキャストしても順番が保証されません。

順番を維持するにはsortedを利用

Pythonのiterableなオブジェクトの並び替えに sorted が使えます。
どうやら、この際に key としてlistのindexを指定できれば良さそうです。

docs.python.org

listのindexを取得するには、list.index() というものが使えそうです。
つまり、最終的には以下のようにすればOKです。

 hiragana = ["あ", "い", "う", "え", "お", "あ"]
sorted(set(hiragana), key=hiragana.index)
-> ['あ', 'い', 'う', 'え', 'お']

これで重複を排除しつつlistの順番を維持できました。