前提
最近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
回答1件
あなたの回答
tips
プレビュー