eljefeblog 

Any sufficiently advanced technology is indistinguishable from magic

python_problems

独学でPython『辞書操作』の基本を学ぶ【プログラミング基礎練習問題1】

独学でPython『辞書操作』の基本を学ぶ【プログラミング基礎練習問題1】




(Pythonの基本を初めからしっかり学びたい方はこちら↓↓)



プログラミングの基本を学んだ方からよくこのような質問を頂きます。

悩むペン銀

Pythonの基本構文を学んで、プログラミングに対する基礎知識もある程度勉強したんだけど、次に何をすればいいのか分からない。次に何をすればより成長できるか教えて欲しい



こう言った『次に何すればいいか分からない』と言う疑問に対し、



僕からの回答を言うと、



『問題を沢山解きましょう』

です。




これこそプログラミング力飛躍的に向上させる一番の近道です。



このシリーズを最後まで学習することで、これまで学んできた基礎知識を定着させ、
最終的に様々な問題をPythonを駆使して解決できるようになるはずです。



本シリーズを習得した後、
得ることができる主な知識・内容は以下3点です。


本記事の内容

  • 基礎問題を解く事で辞書操作の基礎知識
  • 辞書操作を行う上で役立つ組み込み関数に関する知識
  • 辞書の応用方法について


  • この記事を書いている僕は国立大学にてCSの学位を保有しており
    エンジニアとしての仕事では現実問題を解き続けています。



    実際に問題を解いていくと今まで知らなかった便利な組み込み関数や
    新しい思考プロセスを学ぶことができます。



    それではやっていきましょう。







    (注) 問題のレベルについて



    以下に示す問題のレベルは五段階に分割しています。
    あくまでも目安なので、自分が解いてみたい問題から手をつけてみてください。
    プログラミングの勉強は継続が重要です。なので楽しさを優先しましょう!


  • very easy
  • easy
  • normal
  • difficult
  • very difficult






  • 【問題1】辞書操作 レベル: easy


    辞書の要素をjsonファイルに書き込め

    【問題】

    引数として辞書を渡された時、辞書の要素をjsonファイルに書き込む関数を作成してほしい。関数名はwrite_elmentsとしよう。



    具体例


    実装したwrite_elements関数に実際に引数を渡した場合、
    以下のような結果となるように実装してください。

  • write_elements({‘apple’:3,’grape’:12,’strawberry’:32}) → tmp.json



  • 注意事項



    以下の要点を満たすような設計を行います。

  • 引数として1つの辞書を受け取る



  • テスト


    以下のテストコードをエラー無く通過できれば正解です。
    作成した関数を以下のように自分の環境に書き込んで完成させ
    実行してみましょう。

    def write_elements(dict):
      # ここにコードを入力してください
        return your_answer
    
    
    
    
    def read_elements():
        import json 
        with open('tmp.json') as f:
            dict2=json.load(f)
        return dict2
    
    
    
    
    if __name__ == '__main__':
        dict1={'apple':3,'grape':12,'strawberry':32}
        write_elements(dict1)
        assert read_elements() == {'apple':3, 'grape':12, 'strawberry':32}
        print('Pass!!')
        




    解答例


    
    def return_the_last_element(arg):
        return arg[-1]
    





    解説付き解答例

    
    
     def return_the_last_element(arg):
        return arg[-1] # リスト末尾より一つの要素を取り出す
    
    




    更に深く学ぶ+α

    Jsonファイルとは


    JSONはJava Script Object Notationの事で同じもしくは異なるネットワーク間でのデータの送受信や格納ができるファイル形式の事です。 一般的にREST API等で良く利用されます。(webシステムを外部から利用する為のプログラムの呼出規約(API))
    JSONはコンパイルされておらず、人間が直接ファイルを読める点も利点です。 以下のような形式でPythonでの辞書をそのままファイルに保存する事ができます。
    
    {
    "Name": "Alex",
    "Age": 19,
    "Gender": "Male",
    "Hobby":"Soccer"
    "Favorite food":["apple","pizza","Udon"]
    }
    
    


    PythonでJsonファイルの読み書きを行う


    Pythonの標準ライブラリのjsonモジュールを使うとJson形式のファイル等を解析して辞書などのデータ構造をオブジェクトとして読み込めます。
    公式:JsonについてPython公式ドキュメント


    Pythonでの辞書をJsonファイル形式で書き込む

    辞書オブジェクトを書き込む場合は以下のようにします。
    
    import json
    
    dict={'wine':1000,'pizza':1200,'pickle':300}
    with open('new_file.json','w') as f:
         json.dump(dict, f, indent=1)
    
    
    保存されたコードは以下のようにして確認します。

    JsonファイルをPythonの辞書として読み込む


    
    with open('new_file.json') ass f:
        result = json.load(f)
        print(result)
    
    {
    'wine':1000,
    'pizza':1200,
    'pickle':300
    }
    
    
    








    【問題2】辞書操作 レベル: easy


    2つの辞書をマージせよ

    【問題】

    引数として受け取る2つの辞書について、これらをマージし、1つの辞書にして返すmerge_dictionary関数を実装せよ。




    具体例


    作成したmerge_dictionary関数に引数を与えた時、
    結果は以下のようになります。

  • dic1= {“Apple”:[12,33,23,23],”Orange”:[22,14,12,12,12],”cherry”:[32,323,43,12],”Melon”:[45,34,1,31]}
  • dic2= {“lemon”:[23,33],”broccoli”:[2,4,2,5,6],”Tomato”:[3,23,53,3],”lettuce”:[25,25,2,4,6]}

  • merge_dictionary(dic1,dic2)→{“Apple”:[12,33,23,23],”Orange”:[22,14,12,12,12],”cherry”:[32,323,43,12],”Melon”:[45,34,1,31],”lemon”:[23,33],”broccoli”:[2,4,2,5,6],”Tomato”:[3,23,53,3],”lettuce”:[25,25,2,4,6]}



    注意事項


    以下の要件にしたがって関数を設計してください

  • 作成した関数の引数には辞書とリストの2つの引数をとり、辞書を返す


  • テスト


    以下のテストコードをエラー無く通過できれば正解です。
    あなたの回答を書き込んで関数を完成させ、確認してみましょう。

    # This will get executed each time the exercise gets initialized def merge_dictionary(dict1,dict2): #ここにコードを入力してください return your_answer dict1={'red':3,'blue':4,'black':2} dict2={'pink':1,'purple':5,'green':9} assert merge_dictionary(dict1, dict2) == {'red':3,'blue':4,'black':2,'pink':1,'purple':5,'green':9} dict1={'red':[2,5,2],'blue':[666,63,43],'black':[2,5,7]} dict2={'pink':[1,5,2],'purple':[7,4,5],'green':[1,4,2]} assert merge_dictionary(dict1, dict2) == {'red':[2,5,2],'blue':[666,63,43],'black':[2,5,7],'pink':[1,5,2],'purple':[7,4,5],'green':[1,4,2]} print('Pass!!')
    Use the assignment operator (<-) to create the variable a.



    解答例


    少なくとも10分間は自分の頭で考えて問題を解きましょう。
    10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。

    
    def merge_dictionary(dic1, dic2):
        dic3 = dic1.copy()
        dic3.update(dic2)
        return dic3





    解説付き解答例

    
    def merge_dictionary(dic1, dic2):
        dic3 = dic1.copy() #引数dic1の辞書をdic3に保持する(dic1とは別物)
        dic3.update(dic2) #引数dic2の辞書をdic3に追加する
        return dic3
          
    /




    更に深く学ぶ+α


    辞書の要素を全てコピーする

    辞書に格納されている値とKeyを全てコピーするには.copy()のデータ型関数を利用します。


    別の辞書の要素を使い、既存の辞書を更新する

    すでに作成されている辞書に別の辞書の要素を使いするには.update()のデータ型関数を利用します。引数には使いしたい辞書を指定します。

    また以下のように重複するkeyが存在する場合、既存のkeyの値は上書きされます

    
    dict1={'apple':1,'peach':2,'lemon':3}
    dict2={'apple':3,'graph':3,'orenge':3}
    dict1.update(dict2)
    print(dcit1)
    {'apple': 3, 'peach': 2, 'lemon': 3, 'graph': 3, 'orenge': 3}
    
    /








    【問題3】辞書操作 レベル: normal



    Keyより新しい辞書を作り出せ

    【問題】

    引数で辞書と辞書内のKeyが渡される、渡されたKeyを元に、辞書から新しい辞書を作成するextract_dict関数を実装せよ。




    具体例


    実装したextract_dict関数に与える引数とその結果は以下のようになるようにしましょう。

  • dic={'name': 'victory','age':18,'sex': male,'color':'black'}
  • keys=['name','color']
  • extract_dict(dic,keys)→ {'name':'victory','color':'black'}



  • 注意事項


    以下の要点を満たすような設計を行います。

  • 関数の戻り値は辞書で返す



  • テスト


    以下のテストコードをエラー無く通過できれば正解です。
    あなたの回答を書き込んで関数を完成させ、確認してみましょう。

    # This will get executed each time the exercise gets initialized def extract_dict(dic,keys): ここにコードを入力してください return your_answer dic={"name":"Alex","age":19,"gender":"male","height":190} keys=["name","gender"] assert extract_dict(dic,keys) == {"name":"Alex","gender":"male"} dic={"name":"Kate","age":23,"gender":"female","height":160} keys=["name","height"] assert extract_dict(dic,keys) == {"name":"Kate","height":160} dic={"name":"John","age":25,"gender":"male","height":183} keys=["name","age"] assert extract_dict(dic,keys) == {"name":"John","age":25} print('Pass!!')
    Use the assignment operator (<-) to create the variable a.




    解答例


    少なくとも10分間は自分の頭で考えて問題を解きましょう。
    10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。

    
    def extract_dict(dic, keys):
        result= {i: dic[i] for i in keys}
        return result
          





    解説付き解答例

    
    def extract_dict(dic, keys):
        result = {i: dic[i] for i in keys} # 引数keysより要素(key)を取り出し、このkeyに該当する要素を引数dicより取り出す。これらを新しい辞書resultに逐次、格納する。
        return result
          



    更に深く学ぶ+α


    内包表記でfor文を一行で書く

    リスト内包表記がPythonではサポートされています。 一般的なfor文は以下のように描きました。
    
    data=[1,2,3,4,5]
    new_data = []
    for idx in data:
        new_data.append(idx)
    
    
    一方で内包表記は次のように書けます
    
    data=[1,2,3,4,5]
    new_data=[idx for idx in data]
    
    
    この書き方はとてもシンプルで簡単に理解できるので便利です。 条件分岐も以下のように書くことができます。
    
    data=[1,2,3,4,5]
    new_data = [idx for idx in data if idx%2==0]
    print(new_data)
    [2,4]
    
    
    これはリスト内の数字で2で割ったときに余りが0な数字(偶数)であれば 新しいリストに追加する内包表記です。 通常のif文で書くと長くなってしまいますが内包表記を使うとここまでシンプルに書くことができます。


    リスト内包表記は演算が速い

    一般的に通常のfor文で書くよりも内包表記の方が処理速度が高速であることが知られています。より最適化されたコードの実装が求められる場面では、有効なコーディング表記であることを覚えておくとよいでしょう。







    人気記事【初学者必見】効率的なプログラミング勉強方法を紹介します







    このエントリーをはてなブックマークに追加
    data-ad-format="rectangle" data-ad-format="rectangle"

    返信する

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    某国立大学大学院(理系)に所属しています。 最近の趣味は人工知能関連の論文を読む事で 研究ではComputer Vision周りを中心に活動しており、 サイドワークとしてデータ分析の業務に関わっています。 本ブログはこれまで筆者が学んできた様々な知識の中から 有益だと思えた情報のみをまとめたものです。 内容は個人の見解であり、所属する機関と関係するものではありません。 Research: is related to Computer Vision Hobby: is to study Artificial Intelligence / Machine Learning.