Pythonでlistをsetで重複排除してソート
Pythonでsetを使う際にいろいろ困ったのでこちらに備忘録を残します。
setとは?
集合を扱うための仕組み。
公式ドキュメントは以下です。
特徴としては、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を指定できれば良さそうです。
listのindexを取得するには、list.index()
というものが使えそうです。
つまり、最終的には以下のようにすればOKです。
hiragana = ["あ", "い", "う", "え", "お", "あ"] sorted(set(hiragana), key=hiragana.index) -> ['あ', 'い', 'う', 'え', 'お']
これで重複を排除しつつlistの順番を維持できました。