いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Pythonメモ-91 (python 3.7 からdictの挿入順序が保証されている)(Dictionaries now ordered, 順番を守ったまま重複を削除する)

概要

Python 3.7 から dict の挿入順序が保持されるというのが、公式に Python 言語仕様の一部であると 宣言されました 。

docs.python.org

mail.python.org

公式に宣言されたのは、素晴らしいことです。

順番を守ったまま重複を削除する

qiita の方に

qiita.com

というのを見つけまして、順番を保持しつつ重複を削除する というのを sorted + set + list.index という組み合わせで実現されていて、なるほど~ってなりました。

同じことを python 3.7 で実現する場合は、dict が挿入順序を保持してくれるのが保証されているので

list(dict.fromkeys(script))

で出来ます。

ちなみに、この「順番を保持しつつ重複を削除する」という話題は、前から stackoverflow でも盛り上がっている話題でして

中でも、python 界隈で有名な Raymond Hettinger さんの答えがとても秀逸なので、以下にメモ。

stackoverflow.com

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']

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com