概要
Python 3.7 から dict の挿入順序が保持されるというのが、公式に Python 言語仕様の一部であると 宣言されました 。
公式に宣言されたのは、素晴らしいことです。
順番を守ったまま重複を削除する
qiita の方に
というのを見つけまして、順番を保持しつつ重複を削除する というのを sorted + set + list.index という組み合わせで実現されていて、なるほど~ってなりました。
同じことを python 3.7 で実現する場合は、dict が挿入順序を保持してくれるのが保証されているので
list(dict.fromkeys(script))
で出来ます。
ちなみに、この「順番を保持しつつ重複を削除する」という話題は、前から stackoverflow でも盛り上がっている話題でして
中でも、python 界隈で有名な Raymond Hettinger さんの答えがとても秀逸なので、以下にメモ。
python 2系と3系の両方のやり方がわかりやすく書かれていて、とても参考になります。
サンプル
ついでに、ちょっとしたサンプル。
""" Python 3.7 で 辞書の挿入順序が保持されることを確認するサンプルです。 REFERENCES:: http://bit.ly/2VIggXP http://bit.ly/2VySRIe http://bit.ly/2VFhjI4 http://bit.ly/2VEq058 http://bit.ly/2VBKrzK """ from trypython.common.commoncls import SampleBase from trypython.common.commonfunc import pr class Sample(SampleBase): def exec(self): """コードのネタは http://bit.ly/2VBKrzK から拝借""" languages = ['Python', 'Ruby', 'Perl', 'Python', 'JavaScript'] # sorted + set + list.index を組み合わせて 順序キープ しながら重複削除 (from http://bit.ly/2VBKrzK) pr('sorted + set + list.index', sorted(set(languages), key=languages.index)) # python 3.7 からは dict にて挿入順序が保持されることがPython 言語仕様の一部となったので、これでも良い pr('dict (python 3.7)', list(dict.fromkeys(languages))) # ちなみに 順序保証 をしない set() を使うと重複削除はできるけど、当然順序はキープできない pr('set (python 3.7)', list(set(languages))) def go(): obj = Sample() obj.exec() if __name__ == '__main__': go()
try-python/dict_preserved_insert_order_py37.py at master · devlights/try-python · GitHub
実行すると以下のような感じになります。
sorted + set + list.index=['Python', 'Ruby', 'Perl', 'JavaScript'] dict (python 3.7)=['Python', 'Ruby', 'Perl', 'JavaScript'] set (python 3.7)=['Python', 'Perl', 'Ruby', 'JavaScript']
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場