練習問題: Dict, JSON, Web API (P)

練習問題は、以下のステップを処理していきましょう。

問題 A

成績データをまねた dict データ構造を用いて、いろいろデータ処理してみましょう。 どちらかというと、dict に慣れる練習ですね。

  • json_test/test_data_gen.py に演習用サンプルデータ生成器を置いておきます。
  • 皆さんが取り組むのは、 json_test/dict_kadai.py。冒頭、先程の test_data_gen.py の機能を使って dict1 というサンプルデータを作成しています。12345678 の部分は、そのままでも構いませんが、別の値をいれると、dict1の中身が変わります。皆さんは、仕様を満たすようなどんな中身が来ても動作するようなプログラムを作成しましょう。

dict1 には、以下のような感じの情報が 10人分入っています。

{'student0_YmE': {'数学': 88, '英語': 75, '物理': 66, '化学': 85}, 
 'student1_lYF': ... }

ID (例:student0_YmE) や選択科目、スコアは、学生によって異なるが、 全員数学と英語は受講している。 理科は、物理、化学、生物の3科目から好きな数(0含む)受講している。

Lesson1

dict1 から、各学生の ID と数学の成績の組を 10 行にわたって表示しましょう。順番は問わないです。

実行例:

student0_LGl 78
student1_nFE 85
...

Lesson 2

dict1 から、各学生の ID を key として、数学の成績の値となるような dict: math_dict を作成し、print(math_dict) で表示しましょう。

実行例:

{'student0_LGl': 78, 'student1_nFE': 85, .. }

Lesson 3

dict1 から、英語の点数を集めて list にし、点数順にソートしましょう。 一般に list0 は、 要素が大小比較できるようなデータ構造なら、list0.sort() でソート可能です。余談ですが、順番を逆にしたい場合は、list0.sort(reverse=True) で OK. まあ試してみてください。

実行例:

[67, 70, 71, 73, 74, 78, 82, 84, 87, 88]

Lesson 4

各科目の受験者数を dict 形式で出力してみましょう。

実行例:

{'数学': 10, '英語': 10, '物理': 7, '化学': 7, '生物': 3}

Lesson 5

各科目の合計点と受験者数、平均点を以下のような dict にまとめてみましょう。

実行例:

{'数学': {'num': 10, 'total': 743, 'average': 74.3}, '英語: ...

解き方は様々です。

  • 各教科ごとに、人数や合計点を dict1 から探してきて、結果にためていく
  • dict1 の中身を確認しながら、各教科の合計点などを計算し、最後に結果をまとめる

問題B

  • 先程の dict1 を、
    • JSON ファイルに出力してみましょう。
    • 上記 JSON ファイルを読込んで dict2 を作成してみましょう
  • 同様に、dict1 から、JSON 相当の str を生成し、その文字列から dict3 を作成してみましょう。

作成したファイルは、PyCharm や VS Code の file explorer 部分で、reload しないと現れないかもしれません。ご注意を。

問題C

Web API の実験をするのに、他のサービスにいきなりアクセスしてもらうのは怖いので、 自分で簡易 Web API をあげてアクセスしてもらうことにしました。

上記成績情報を提供する簡易 Web API server を作ってみました。 webserver_test/test_server2.py を実行すると、以下の情報がアクセスできます。

  • http://localhost:18061/students で、学生 ID 一覧が取得可能 (list)
  • http://localhost:18061/scores/<studentID> で、学生 ID に対応する成績が取得可能 (dict)
    • <sdutdentID> 部分は、上記で取得したものを入れてください。

上記 Web API を介して、学生一覧を取得し、その後、各学生の成績を取得表示するプログラムを作成してみましょう。 uplink の解説ページ を見て uplink_test/request_sample.pyを改造する感じで作ってくれるのでOKです。

上記の簡易 Web API server ですが、一度動かすと走りっぱなしなので、終わったらプログラムの停止ボタンを押しておきましょう。 まあ、PyCharm とか停止する際に、一緒に停止してくれるはずですが。