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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

1回答

427閲覧

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

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による文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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]))
guest

回答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

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ponponring

2022/12/04 11:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問