質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

PYTHONでキーの多いJSONデータから、すべてのデータを抽出しさらにMAX値を抽出したい

ponponring
ponponring

総合スコア1

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0グッド

0クリップ

192閲覧

投稿2022/12/03 03:00

前提

最近PYHTONを勉強しています。
JSONデータ(下のサンプル)からデータを抽出し、全学校の評価が一番高い人を抽出したいのが目的です。
JSONサンプルには、学校コード、学年コード、生徒コードがキーとなりますが、すべてNとなるためまずはキーをすべて取得することになります。
次に、学校コード、学年コード、生徒コードのキー分ループを行い、2次元リストを作成し、全生徒のデータを抽出します。最後に全生徒からMAX値を抽出します。

質問

ここで質問です。

①JSONデータの扱いで、for分が多重ネストになってしまい、性能的にも不安です。
python の便利な関数、モジュールで改善できる点がございましたら、ご教授いただきたいです。
そもそも処理フローを見直せという意見もあれば教えていただけると今後のためになるのでうれしいです。

② 2次元リストの中で一番評価が高い生徒(assessment)の1次元リストを抽出したいですが、MAX関数を用いてリストにINDEXを指定してアクセスするという方法を用いると、値のみしか取れないです。1次元リストを抽出したい場合、どのようにすればよいでしょうか。for分で回していくしかないでしょうか。

該当のソースコード

json

1 2{ 3 "00000011": { 4 "0111": { 5 "01": { 6 "Name": "sato", 7 "birthday": "20000321", 8 "address": "tokyo", 9 "assessment": "5" 10 }, 11 "02": { 12 "Name": "takahashi", 13 "birthday": "20000322", 14 "address": "tokyo", 15 "assessment": "4" 16 }, 17 "03": { 18 "Name": "kato", 19 "birthday": "20000326", 20 "address": "tokyo", 21 "assessment": "2" 22 }, 23 "04": { 24 "Name": "saito", 25 "birthday": "20000222", 26 "address": "tokyo", 27 "assessment": "4" 28 } 29 }, 30 "0114": { 31 "01": { 32 "Name": "miyamoto", 33 "birthday": "20000311", 34 "address": "tokyo", 35 "assessment": "3" 36 }, 37 "02": { 38 "Name": "arata", 39 "birthday": "20000322", 40 "address": "tokyo", 41 "assessment": "3" 42 }, 43 "03": { 44 "Name": "urahara", 45 "birthday": "20000326", 46 "address": "tokyo", 47 "assessment": "2" 48 }, 49 "04": { 50 "Name": "nakagawa", 51 "birthday": "20000222", 52 "address": "tokyo", 53 "assessment": "1" 54 } 55 } 56 }, 57 "00000012": { 58 "0112": { 59 "01": { 60 "Name": "sato", 61 "birthday": "20000121", 62 "address": "tokyo", 63 "assessment": "1" 64 }, 65 "02": { 66 "Name": "takahashi", 67 "birthday": "20000622", 68 "address": "tokyo", 69 "assessment": "2" 70 }, 71 "03": { 72 "Name": "kato", 73 "birthday": "20000616", 74 "address": "tokyo", 75 "assessment": "2" 76 }, 77 "04": { 78 "Name": "saito", 79 "birthday": "20000822", 80 "address": "tokyo", 81 "assessment": "3" 82 } 83 } 84 }, 85 "00000009": { 86 "0109": { 87 "01": { 88 "Name": "kaito", 89 "birthday": "20000321", 90 "address": "kanagawa", 91 "assessment": "4" 92 }, 93 "02": { 94 "Name": "eto", 95 "birthday": "20000422", 96 "address": "kanagawa", 97 "assessment": "4" 98 }, 99 "03": { 100 "Name": "kato", 101 "birthday": "20000726", 102 "address": "kanagawa", 103 "assessment": "1" 104 }, 105 "04": { 106 "Name": "saito", 107 "birthday": "20000224", 108 "address": "kanagawa", 109 "assessment": "1" 110 } 111 }, 112 "0110": { 113 "01": { 114 "Name": "sato", 115 "birthday": "20000311", 116 "address": "tokyo", 117 "assessment": "3" 118 }, 119 "02": { 120 "Name": "mamiya", 121 "birthday": "20000322", 122 "address": "tokyo", 123 "assessment": "3" 124 }, 125 "03": { 126 "Name": "noto", 127 "birthday": "20000326", 128 "address": "tokyo", 129 "assessment": "2" 130 }, 131 "04": { 132 "Name": "kagawa", 133 "birthday": "20000222", 134 "address": "tokyo", 135 "assessment": "4" 136 } 137 } 138 }, 139 "00000010": { 140 "0110": { 141 "01": { 142 "Name": "sato", 143 "birthday": "20000321", 144 "address": "kanagawa", 145 "assessment": "4" 146 }, 147 "02": { 148 "Name": "tanaka", 149 "birthday": "20000422", 150 "address": "kanagawa", 151 "assessment": "4" 152 }, 153 "03": { 154 "Name": "tagawa", 155 "birthday": "20000726", 156 "address": "kanagawa", 157 "assessment": "1" 158 }, 159 "04": { 160 "Name": "iida", 161 "birthday": "20000224", 162 "address": "kanagawa", 163 "assessment": "1" 164 } 165 } 166 } 167} 168

python

1import json 2json_open = open('schoolsampple.json', 'r') 3json_load = json.load(json_open) 4 5# 学校コード 6schoolcode_key_list = [key for key in json_load] 7 8schoolpupil_list = [] 9 10for schoolcode in schoolcode_key_list: 11 12 # 学年コード 13 schoolyearcode_list = [schoolyearcode for schoolyearcode in json_load[schoolcode]] 14 15 for schoolyearcode in schoolyearcode_list: 16 17 # 生徒データを取得 18 pupil_data = json_load[schoolcode][schoolyearcode] 19 20 # 生徒コード 21 pupilcode_list = [pupilcode for pupilcode in pupil_data] 22 23 for pupilcode in pupilcode_list: 24 25 print(pupil_data[pupilcode]) 26 27 plist = [] 28 plist.append(schoolcode) 29 plist.append(schoolyearcode) 30 plist.append(pupilcode) 31 plist.append(pupil_data[pupilcode]['Name']) 32 plist.append(pupil_data[pupilcode]['birthday']) 33 plist.append(pupil_data[pupilcode]['address']) 34 plist.append(pupil_data[pupilcode]['assessment']) 35 schoolpupil_list.append(plist) 36 37print(schoolpupil_list) 38 39>> 40[ 41 ['00000011', '0111', '01', 'sato', '20000321', 'tokyo', '5'], 42 ['00000011', '0111', '02', 'takahashi', '20000322', 'tokyo', '4'], 43 ['00000011', '0111', '03', 'kato', '20000326', 'tokyo', '2'], 44 ['00000011', '0111', '04', 'saito', '20000222', 'tokyo', '4'], 45 ['00000011', '0114', '01', 'miyamoto', '20000311', 'tokyo', '3'], 46 ['00000011', '0114', '02', 'arata', '20000322', 'tokyo', '3'], 47 ['00000011', '0114', '03', 'urahara', '20000326', 'tokyo', '2'], 48 ['00000011', '0114', '04', 'nakagawa', '20000222', 'tokyo', '1'], 49 ['00000012', '0112', '01', 'sato', '20000121', 'tokyo', '1'], 50 ['00000012', '0112', '02', 'takahashi', '20000622', 'tokyo', '2'], 51 ['00000012', '0112', '03', 'kato', '20000616', 'tokyo', '2'], 52 ['00000012', '0112', '04', 'saito', '20000822', 'tokyo', '3'], 53 ['00000009', '0109', '01', 'kaito', '20000321', 'kanagawa', '4'], 54 ['00000009', '0109', '02', 'eto', '20000422', 'kanagawa', '4'], 55 ['00000009', '0109', '03', 'kato', '20000726', 'kanagawa', '1'], 56 ['00000009', '0109', '04', 'saito', '20000224', 'kanagawa', '1'], 57 ['00000009', '0110', '01', 'sato', '20000311', 'tokyo', '3'], 58 ['00000009', '0110', '02', 'mamiya', '20000322', 'tokyo', '3'], 59 ['00000009', '0110', '03', 'noto', '20000326', 'tokyo', '2'], 60 ['00000009', '0110', '04', 'kagawa', '20000222', 'tokyo', '4'], 61 ['00000010', '0110', '01', 'sato', '20000321', 'kanagawa', '4'], 62 ['00000010', '0110', '02', 'tanaka', '20000422', 'kanagawa', '4'], 63 ['00000010', '0110', '03', 'tagawa', '20000726', 'kanagawa', '1'], 64 ['00000010', '0110', '04', 'iida', '20000224', 'kanagawa', '1'] 65] 66 67 68# 2次元リストの中で一番評価が高い生徒(assessment)の1次元リストを抽出する 69maxs = max(schoolpupil_list[0][6]) 70print(maxs) 71 72>> 5 73 74# 上記だと、評価の高い要素のみが取得される。評価の高い生徒の一次元リストがほしい 75

補足情報(FW/ツールのバージョンなど)

python
json

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

melian

2022/12/03 03:22

> ② 2次元リストの中で一番評価が高い生徒(assessment)の1次元リストを抽出したい #maxs = max(schoolpupil_list[0][6]) maxs = max(schoolpupil_list, key=lambda i: int(i[6]))

回答1

0

ベストアンサー

辞書からリストへの変型をしながら全データを処理するのだから、その過程で最大値を求めれば良いかと思います。

Python

1import json 2 3data = json.load(open('schoolsampple.json','r')) 4 5school_pupil_list = [] 6max_score = 0 #実際にあり得るよりも小さい値 7max_data = None 8 9for school_code, school_data in data.items(): 10 for year_code, year_data in school_data.items(): 11 for pupil_code, pupil_data in year_data.items(): 12 plist = [school_code, 13 year_code, 14 pupil_code, 15 *(pupil_data.values()) 16 ] 17 school_pupil_list.append(plist) 18 score = int(pupil_data['assessment']) 19 if score > max_score: 20 max_score = score 21 max_data = plist 22 23print(school_pupil_list) 24 25print(max_data)

投稿2022/12/03 04:50

otn

総合スコア80508

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

ponponring

2022/12/04 11:22

とても参考になりました。ありがとうございます。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。