90%の人が知らないPython炫技操作:辞書を統合する7つの方法

15664 ワード

Python言語には多くの(しかもますます多くなる)高級特性があり、Pythonの熱狂的な友达が大好きです.彼らの目には、一般開発者には分からない高級な特性を書くことができるのが達人で、大神だ.
しかし、チームワークでは、自慢技はタブーであることを知っておく必要があります.
どうしてそう言うのですか.私は自分の意見を言います.
  • 簡潔なコードほど、明確な論理ほどエラーが発生しにくい.
  • チームの協力の中で、あなたのコードはあなただけが維持しているのではなく、他の人のコードの論理を読む/理解するコストを下げるのは良い品格です
  • 簡単なコードは、最も基本的な文法糖、複雑な高度な特性しか使用されず、言語のバージョンなどのより多くの依存性があります.
    この編は「炫技シリーズ」の2編目の内容で、このシリーズでは、私が見たことのある炫技操作をまとめてみます.ここでは、Pythonの熱狂的な友达であれば、クールなコードを書くテクニックを学ぶことができます.また、これらの内容を見ると、他の人のコードを読むときに役立つかもしれません.ちなみに、Pythonの就職のためにも趣味のためにも、プロジェクト開発の経験は永遠に核心であり、新しいプロジェクトの練習が欠けているかpythonのチュートリアルがなければ、編集者のPythonに行って交流することができます.スカート:七衣九七七巴而五(数字の谐音)転换で见つけることができて、中の多くの新しい教程のプロジェクト、また古い运転手と交流して教えを乞うことができます!
    1.最も簡単な現地更新
    辞書オブジェクトには、別の辞書を自分に更新するためのupdateメソッドが組み込まれています.
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> profile.update(ext_info) >>> print(profile) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 

    updateという最も簡単で、最もオリジナルな方法を使用したいが、自分に更新したくないで、新しいオブジェクトを生成したい場合は、深いコピーを使用してください.
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> from copy import deepcopy >>> >>> full_profile = deepcopy(profile) >>> full_profile.update(ext_info) >>> >>> print(full_profile) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} >>> print(profile) {"name": "xiaoming", "age": 27} 

    2.パッケージを解いてから辞書をマージする**を使用すると辞書を解包することができ、解包が終わったらdictまたは{}を使用すると合併することができます.
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> full_profile01 = {**profile, **ext_info} >>> print(full_profile01) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} >>> >>> full_profile02 = dict(**profile, **ext_info) >>> print(full_profile02) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 
    dict(**profile, **ext_info)が何をしたか分からない場合は、それを等価にすることができます.
    >>> dict((("name", "xiaoming"), ("age", 27), ("gender", "male"))) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 

    3.itertoolsを借りる
    Pythonには、反復可能なオブジェクトの操作に特化した強力な内蔵モジュールがあります.
    ちょうど私たちの辞書も反復可能なオブジェクトであり、itertools.chain()関数を使用して複数の辞書(反復可能なオブジェクト)を直列に接続し、より大きな反復可能なオブジェクトを構成してからdictを使用して辞書に変換できることが考えられます.
    >>> import itertools
    >>>
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> >>> dict(itertools.chain(profile.items(), ext_info.items())) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 

    4.ChainMapを借りる
    補助パッケージを1つ導入できれば、もう1つ提案します.ChainMapitertoolsと同じ効果を達成することができます.
    >>> from collections import ChainMap
    >>>
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> dict(ChainMap(profile, ext_info)) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 

    ChainMapを使用するには、辞書の間に重複するキーがある場合、最初の値だけが取られ、後ろに並んでいるキー値は前の値を更新しません(itertoolsを使用するとこの問題はありません).
    >>> from collections import ChainMap
    >>>
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info={"age": 30} >>> dict(ChainMap(profile, ext_info)) {'name': 'xiaoming', 'age': 27} 

    5.dict.items()を使用してマージ
    Python 3.9以前には|オペレータがありましたが、集合(set)の並列化に一般的に使用されています.
    これを利用して、辞書の合併にも使えますが、回り道をしなければならないので、少し理解しにくいです.itemsの方法でdictをdictに変換しなければなりませんitems、この2つのdict_itemsは並列セットをとり,最後にdict関数を用いて辞書に変換する.
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> full_profile = dict(profile.items() | ext_info.items()) >>> full_profile {'gender': 'male', 'age': 27, 'name': 'xiaoming'} 

    もちろん、面倒なのが嫌なら簡単にリスト関数を直接使ってマージすることもできます(例:Python 3.x)
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> dict(list(profile.items()) + list(ext_info.items())) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 

    もしあなたがPythonにいたら.xではlist関数を直接省くことができます.
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> dict(profile.items() + ext_info.items()) {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 

    6.最もクールな辞書解析式
    Pythonには生成リスト、集合、辞書に対して、非常にPythonicの書き方があります.
    それはリストの解析式、集合の解析式と辞書の解析式で、通常Pythonの熱狂的な友达の最も好きなことで、それでは今日のテーマ:辞書の合併、辞書の解析式はまだ適任ですか?
    もちろん、具体的なサンプルコードは次のとおりです.
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> {k:v for d in [profile, ext_info] for k,v in d.items()} {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 

    7.Python 3.9新機能
    2月にリリースされたPython 3.9.04 aバージョンでは、注目を集める新しいオペレータオペレータオペレータが追加されました.|、PEP 584は、複数の辞書を直感的に統合できる統合オペレータ(Union Operator)と呼ばれています.
    >>> profile = {"name": "xiaoming", "age": 27} >>> ext_info = {"gender": "male"} >>> >>> profile | ext_info {'name': 'xiaoming', 'age': 27, 'gender': 'male'} >>> >>> ext_info | profile {'gender': 'male', 'name': 'xiaoming', 'age': 27} >>> >>> 
    |オペレータに加えて、その場での更新と同様に、もう1つのオペレータ|=があります.
    >>> ext_info |= profile
    >>> ext_info
    {'gender': 'male', 'name': 'xiaoming', 'age': 27} >>> >>> >>> profile |= ext_info >>> profile {'name': 'xiaoming', 'age': 27, 'gender': 'male'} 

    ここを見て、姿勢を上げたかどうか、こんなに長い間Pythonを勉強していたのに、辞書を合併する方法がこんなに多いとは思わなかった.この文章の主旨は、この7種類の辞書を統合する方法をすべて身につけることではありません.実際には、仕事の中で、最も使いやすい方法を選ぶだけでいいのですが、協同作業の中で、あるいは他人のコードを読むとき、いろいろな書き方に出会うことは避けられません.このとき、意識的に辞書を統合する操作であることを知ることができます.この文章には意味がある.最後に、Pythonの就職のためにも趣味のためにも、プロジェクト開発の経験は永遠に核心であることを覚えておいてください.もし新しいプロジェクトの練習が欠けているか、pythonのチュートリアルがなければ、編集者のPythonに行って交流することができます.スカート:七衣九七七巴而五(数字の谐音)転换で见つけることができて、中の多くの新しい教程のプロジェクト、また古い运転手と交流して教えを乞うことができます!
    本文の文字と画像はネットに由来して自分の考えを加えて、ただ学習、交流のために使用して、いかなる商業の用途を持っていないで、著作権は原作者の所有に帰って、もし問題があれば直ちに私达に連絡して処理してください.