Pythonノート002-リスト導出式

4315 ワード

Pythonノート002-リスト導出式
以下は私が『流暢なPython』を勉強した後の個人ノートです.今出して皆さんと共有して、Python学習者の皆さんに役に立つことを望んでいます.
初発表:微信公衆番号:科学技術の丁兄、ID:TechDing、注目してください.
本編の主な知識点:
  • リストの導出式は、1つのシーケンスから別のシーケンスを迅速に構築することができ、非常に便利で迅速で、使用を強くお勧めします.
  • リスト導出式は簡単なforループに適用され、1つのリスト内の各要素を同じ操作を行うことができ、元のリストで一定の条件を満たす要素を選択して新しいリストを構成することができる.
  • 集合導出式の応用は比較的少ないが、辞書導出式は広く応用されており、1つのdictから一定の条件を満たすitemsを選択して新しいdictを構成したり、元のdictのkeyやvalueを操作したりすることができる.
  • リスト導出式には、ある関数をループ実行したり、あるリストをdictに変換したり、dictをlistに変換したりするための極めて広範な応用シーンがある.

  • 1.リスト導出式
    リスト導出式はリストを構築するショートカットであり、可読性が高く、それを用いて書かれたコードはPythonの味があり、非常に推奨されるプログラミングスタイルである.
    また、Pythonの内部実装はリスト導出式を大幅に最適化し、運転速度が非常に速いことを保証しています.
    リスト導出式は[]のみを使用してlistを生成することができ、基本コードフォーマットは:[ for in ] [ for in if ]であり、以下の2つのフォーマットの実装方法である.
    ## demo1:
    alist=[1,2,3,50,89,26,30]
    odd=[i for i in alist if i%2==1] #     alist      
    print(odd) # [1, 3, 89]
    

    Pythonのリスト導出式は主にJavaやC言語のforループを置き換えています.forループを使用して簡単なビジネスを実現したい場合は、リスト導出式を使用してください.
    ### demo2:
    alist=[1,2,3,50,89,26,30]
    plus=[i*2+10 for i in alist] #       
    print(plus) # [12, 14, 16, 110, 188, 62, 70]
    

    もちろん、複雑な業務であれば、複数行のコードが必要ですが、おとなしく実用的なforループで実現しましょう.この点から,リスト導出式は関数中のlambda式に類似しており,簡単な関数は直接lambdaで表すことができる.
    リスト導出式はまた、一般に可読性が比較的強いために、最大3層のネストを実現することもできる.
    ### demo3:           
    alist=[1,2,5]
    blist=['A','B','C']
    combined=[b+'_'+str(a) for b in blist for a in alist]
    print(combined) # ['A_1', 'A_2', 'A_5', 'B_1', 'B_2', 'B_5', 'C_1', 'C_2', 'C_5']
    
    # demo4:       :     
    combined2=[b+'_'+str(a) for b in blist for a in alist if a%2==1]
    print(combined2) # ['A_1', 'A_5', 'B_1', 'B_5', 'C_1', 'C_5']
    

    2.その他の導出式
    リスト導出式は、リスト(list)だけでなく、set、dictなどの他のシーケンスタイプにも適用されます.だからsetを生成することを集合導出式,dictを生成することを辞書導出式と呼ぶ人もいる.
    集合導出式の使用法はリスト導出式と同様に[]を{}に変更するだけでよいが、得られた集合要素間が重複すると、setの特性:要素が重複して決定できない1つだけが保持される.
    ###      :
    ## demo1:
    alist=[1,2,3,50,89,26,30]
    odd={i for i in alist if i%2==1} #     alist      
    print(odd) # {89, 1, 3}
    

    辞書導出式の使い方はリスト導出式と同様に[]を{}に変更するだけですが、反復するオブジェクトは辞書タイプです.
    辞書導出式を使用すると、key、valueを以下で交換するなど、多くの多様な操作を実現できます.
    ###      :
    # demo1: key,value  ;
    dictA={'a':10,'b':20,'c':30}
    changed={value:key for key,value in dictA.items()}
    print(changed) # {10: 'a', 20: 'b', 30: 'c'}
    

    例えば、keysを単独で反復し、keysが一定の条件を満たすitemsを選択して新しいdictを構成することもできる.
    ### demo2:   key    items
    dictB={1:'10',2:'20',3:'30',4:'40'}
    odd_dict={key:dictB[key] for key in dictB.keys() if key%2==1}
    print(odd_dict) # {1: '10', 3: '30'}
    

    同様に、valuesを単独で反復する、valuesが一定の条件を満たすitemsからなる新しいdictを選択することもできる.
    3.適用例
    リストの導出には、次のような他の適用シーンもあります.
    ループ関数:
    #         :
    import time
    def func_test(x):
        print('start test: {}'.format(x))
        time.sleep(1)
        print('end test: {}'.format(x*2)) #     2
    [func_test(x) for x in range(10,15,2)] #                
    

    start test: 10 end test: 20 start test: 12 end test: 24 start test: 14 end test: 28
    ループ実行関数を実行し、戻り値を取得します.
    #         :
    import time
    def func_test(x):
        print('start test: {}'.format(x))
        time.sleep(1)
        print('end test: {}'.format(x*2)) #     2
        return x*2
    result=[func_test(x) for x in range(10,15,2)] #                
    print(result) # [20, 24, 28]
    

    リスト導出式と辞書導出式の柔軟な運用により、dictタイプデータとlistデータを相互に変換できます.たとえば、次のようにします.
    #  list    :
    blist=['A','B','C']
    dict_from_list={b:str(idx+10) for idx,b in enumerate(blist)}
    print(dict_from_list) # {'A': '10', 'B': '11', 'C': '12'}
    
    #  dict  list
    dictB={1:'10',2:'20',3:'30',4:'40'}
    list_from_dict=[key for key,_ in dictB.items() if key%2==0] #      key
    print(list_from_dict) # [2, 4]
    

    初発表:微信公衆番号:科学技術の丁兄、ID:TechDing、注目してください.
    本文のすべてのコードはすでに私のgithubにアップロードして、ダウンロードを歓迎します
    参考資料:
  • 『流暢なPython』、Luciano Ramalho(著者)安道、呉珂(訳者).