1. ホーム
  2. パイソン

[解決済み】JSONの文字列をリストではなく辞書に変換する方法

2022-04-01 18:40:36

質問

JSONファイルを渡して、データを辞書に変換しようとしています。

今のところ、こんな感じです。

import json
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)

私が期待しているのは json1_data になります。 dict という型がありますが、実際には list でチェックすると type(json1_data) .

何が足りないのでしょうか?私はキーの1つにアクセスできるように、これを辞書にする必要があります。

どのように解決するのですか?

JSONは内部に1つのオブジェクトを持つ配列なので、読み込むと内部に辞書を持つリストが得られます。以下のように、リストのアイテム0にアクセスすることで、辞書にアクセスすることができます。

json1_data = json.loads(json1_str)[0]

に格納されているデータにアクセスできるようになりました。 データポイント は、あなたが期待していた通りです。

datapoints = json1_data['datapoints']


<ブロッククオート

もう一つ質問があるのですが、どなたかお聞かせください。これらのデータポイントの最初の要素(つまり、datapoints[0][0])の平均を取りたいのです。datapoints[0:5][0]を試してみましたが、両方の要素を含む最初のデータポイントが得られるだけで、最初の要素だけを含む最初の5つのデータポイントを得たいとは思えません。これを行う方法はありますか?

datapoints[0:5][0] は、あなたが期待しているようなことはしません。 datapoints[0:5] は最初の5つの要素だけを含む新しいリストスライスを返し、その後に [0] を末尾につけると、最初の要素である その結果のリストスライスから . 欲しい結果を得るために使用する必要があるのは リスト内包 :

[p[0] for p in datapoints[0:5]]

ここで、平均を計算する簡単な方法を紹介します。

sum(p[0] for p in datapoints[0:5])/5. # Result is 35.8

をインストールしてもいいなら NumPy であれば、さらに簡単です。

import numpy
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)[0]
datapoints = numpy.array(json1_data['datapoints'])
avg = datapoints[0:5,0].mean()
# avg is now 35.8

を使用することで , 演算子とNumPyの配列のスライス構文とは、リストスライスで元々期待されていた動作をします。