JSON-辞書とリストの実用例
記事の内容
この記事では、辞書とリストを組み合わせて定義される構造化データの実用例を紹介します。また、Pythonが採用している構造化データの表記方法であるJSONと、APIに関しての補足説明をしています。
辞書とリストを組み合わせると柔軟にデータを構造化できるため、さまざまな場面で応用されています。すぐに思いつくだけでも、API、アプリケーションのプロパティ管理、ビッグデータを蓄積するデータベースシステム、クラウド上に構築されるシステム構成の定義などなどです。
構造化データは、実用的なプログラム作成でもよく使うので、この記事の例を見て是非モノにしてください。
***わからない用語があるときは索引ページへ***
1.データの構造化について
辞書、リストの表記方法についてはそれぞれの記事で説明しました。辞書オブジェクトとリストオブジェクトの表記で共通する規則として、
・リストの要素、辞書の値にはどんな型の
オブジェクトでも使用できる
・要素数に制限はない
・ネストの深さに制限はない
というのがありました。
これはつまり、辞書オブジェクトをリストオブジェクトの要素としたり、リストオブジェクトを辞書オブジェクトの値にしたり、いくらでもネストを深くしたりすることもできるということです。
頭がこんがらがってきそうです。ここでは「複雑なデータ構造も辞書とリストの組み合わせで柔軟に表現できる」くらいに考え、実例をみていきましょう。
2.辞書とリストによる構造化データの実例
私自慢の自作PCを辞書とリストを組み合わせた構造化データで記述するサンプルプログラムを書いてみました。
##structureddata_ex1.py
##わかりやすいようにパーツ単位で定義
##CPUの構成
cpu0 = {
"clock": 3.7, ##GHz
"core": 4,
"thread": 8
}
##サーバ機では複数のCPUを搭載できるので、cpu_setはリストで定義
cpu_set = [cpu0]
##メモリの構成
memory0 = {
"type": "DDR4",
"size": 8, ##GB
"clock": 2400, ##MHz
}
memory1 = memory0.copy()
memory2 = memory0.copy()
memory3 = memory0.copy()
memory_set = [memory0, memory1, memory2, memory3]
##ストレージの構成
storage0 = {
"drive": "C",
"type": "NVME",
"size": 512, ##GB
}
storage1 = {
"drive": "D",
"type": "HDD",
"size": 3000 ##GB
}
storage_set = [storage0, storage1]
##パーツで定義したオブジェクトを使ってマシンを定義
my_pc = {
"cpu_set": cpu_set,
"memory_set": memory_set,
"storage_set": storage_set
}
##my_pcの構成を出力する。出力するためにjsonオブジェクトを使う
##jsonオブジェクトを取り込み
import json
##jsonオブジェクトのdumpsメソッドでmy_pcオブジェクトを整形された文字列に変換
##my_pc_jsonはmy_pcを文字列データに変換したもの
my_pc_json = json.dumps(my_pc, indent=4)
##整形されたmy_pc_jsonを出力
print(my_pc_json)
私の自作パソコンを構造化したデータmy_pcは、以下の出力結果ようになります。my_pcをprint関数を使ってそのまま出力すると、結果が1行で出力されて読みづらくなるので、jsonオブジェクトのdumpsメソッドを使って出力結果をみやすいように整形しました。
jsonオブジェクトのdumpsメソッドを使うと、データ構造を読みやすく出力してくれます。具体的には、辞書オブジェクトやリストオブジェクトのネストの深さを、"indent=i"のiで指定した数の半角スペースで右へ字下げして出力します。ここで、インデント(indent)とは、段落(文や行の集まり)を字下げすることをいいます。
AmazonAWS、GoogleGCP、MicrosoftAzureなどのクラウドサービスでは、"structureddata_ex1.py"のような感じでサーバの構成を構造化し、APIを介して送信すると、構造化データで定義したとおりの(仮想)サーバを自動かつリアルタイムに構築してくれます。
※)"structureddata_ex1.py"のmy_pcは、説明のために構成を簡素化していますので、このまま動くというわけではありません。
##my_pcの構造化データ
{
"cpu_set": [
{
"clock": 3.7,
"core": 4,
"thread": 8
}
],
"memory_set": [
{
"type": "DDR4",
"size": 8,
"clock": 2400
},
{
"type": "DDR4",
"size": 8,
"clock": 2400
},
{
"type": "DDR4",
"size": 8,
"clock": 2400
},
{
"type": "DDR4",
"size": 8,
"clock": 2400
}
],
"storage_set": [
{
"drive": "C",
"type": "NVME",
"size": 512
},
{
"drive": "D",
"type": "HDD",
"size": 3000
}
]
}
それでは、サンプルプログラム"structureddata_ex1.py"に以下を追記して、my_pcの要素にアクセスして要素データを読み込んでみます。辞書の基本、リストの基本で説明したデータアクセス規則を組み合わせて任意の要素にアクセスすることができます。
my_pcのストレージ構成を読み込んでみる。
##my_pcのストレージ構成にアクセス
my_pc_storage_set = my_pc["storage_set"]
##jsonのメソッドでデータを整形して出力
print(json.dumps(my_pc_storage_set, indent=4))
出力結果。
storage0の辞書オブジェクトと、storage1の辞書オブジェクトを要素とするリストオブジェクトが出力される。
[
{
"drive": "C",
"type": "NVME",
"size": 512
},
{
"drive": "D",
"type": "HDD",
"size": 3000
}
]
つづいてmy_pcのストレージ0のデータにアクセスしてみる。
##my_pc["storage0"]のインデックス0の要素を読み込み
my_pc_storage0 = my_pc["storage_set"][0]
print(json.dumps(my_pc_storage0, indent=4))
このように書いても同じ結果になります
##my_pcの"storage_set"を読み込み
my_pc_storage_set = my_pc["storage_set"]
##my_pc_storage_setのインデックス0を読み込み
my_pc_storage0 = my_pc_storage_set[0]
print(json.dumps(my_pc_storage0, indent=4))
出力結果。
storage0の辞書オブジェクトが出力される。
{
"drive": "C",
"type": "NVME",
"size": 512
}
つづいてストレージ0のストレージタイプにアクセスしてみる
##my_pc["storage_set"][0]で指定される辞書のキーが"type"の値を読み込む
my_pc_storage0_type = my_pc["storage_set"][0]["type"]
print(json.dumps(my_pc_storage0_type, indent=4))
もちろん、2行目の代入式を以下の3行にわけて、
my_pc_storage_set = my_pc["storage_set"]
my_pc_storage0 = my_pc_storage_set[0]
my_pc_storage0_type = my_pc_storage0["type"]
と書いても同じ出力結果になります。
storage0のストレージタイプが出力されます。
"NVME"
3.JSONについて
これまで説明してきた、{}や[]を使ったPythonの辞書、リストの表記方法は、JSONとよばれる表記法に準拠しています。
JSONとは、JavaScript Object Notationの略で、もともとはJAVAスクリプトで使い始めた構造化データの表記方法(規則)なのです。
JSONを使うと構造化データを簡単に表記できるため、他の多くのプログラミング言語でも利用されています。また、APIを介したデータのやりとりでもよく使われます。
この記事での詳細説明は省略しますが、JSONの他には、XMLやYAMLなどの構造化データの表記方法があります。
4.APIについて
APIとは、"Application Programing Interface"の略です。直訳すると、プログラムから、ネットワークを介して、アプリケーションを操作するためのインタフェース(相互接続規則)という意味になります。
プログラムから外部のアプリケーションを操作できると何が便利になるか想像してみましょう。1つには人手の作業をプログラムで自動化できるようになります。また、外部アプリケーションの機能を取り込んで新たなアプリケーションを開発することもできます。
ネット上では多くのサービスがAPIを公開し、だれでも利用できるようにしています。Google、Amazon、Apple、Facebook、Microsoft、Line、note、etc。。。他にもたくさん。これらネットサービスのAPIを利用すれば、個人ではとても作れないAIの機能、例えば画像認識や音声認識、チャットボットなどもAPIを介して簡単に自分のプログラムに取り入れることができるようになります。
APIを使ったプログラミングの詳細については、別の記事で説明します。
この記事が気に入ったらサポートをしてみませんか?