中級演習:成績管理ツール
リスト・辞書・関数を組み合わせて、学生の成績を管理・集計する「成績管理ツール」を作ります。
📝 問題
以下の仕様を満たすプログラムを作成してください。
- 学生のデータを辞書のリストとして定義する(名前・各科目の点数)
- 各学生の 平均点 を計算する
- 平均点に応じて 成績ランク(S/A/B/C)を付ける
- 全学生の成績を 一覧表 として出力する
- どの学生が最高点か、全体の平均点も表示する
ランク基準: S(90点以上)、A(80点以上)、B(70点以上)、C(70点未満)
💡 ヒント
- 成績データは
[{"name": "田中", "scores": {"国語": 82, "数学": 91, ...}}, ...]で定義できます - 辞書の値の合計は
sum(sc.values())、件数はlen(sc)で求められます - ランク判定は
if avg >= 90: return "S"のようなif-elif関数で書けます - 最高平均点の学生は
max(students, key=lambda s: s["avg"])で取り出せます
✅ 回答例
students = [
{"name": "田中", "scores": {"国語": 82, "数学": 91, "英語": 78}},
{"name": "鈴木", "scores": {"国語": 95, "数学": 67, "英語": 88}},
{"name": "佐藤", "scores": {"国語": 73, "数学": 85, "英語": 92}},
{"name": "高橋", "scores": {"国語": 61, "数学": 72, "英語": 65}},
]
def get_rank(avg):
if avg >= 90: return "S"
elif avg >= 80: return "A"
elif avg >= 70: return "B"
else: return "C"
# 各学生の平均を計算して追加
for s in students:
sc = s["scores"]
s["avg"] = sum(sc.values()) / len(sc)
s["rank"] = get_rank(s["avg"])
# 一覧表を出力
print(f"{'名前':<6} {'国語':>4} {'数学':>4} {'英語':>4} {'平均':>6} {'ランク':>5}")
print("-" * 35)
for s in students:
sc = s["scores"]
print(f"{s['name']:<6} {sc['国語']:>4} {sc['数学']:>4} {sc['英語']:>4} {s['avg']:>6.1f} {s['rank']:>5}")
# 全体集計
all_avgs = [s["avg"] for s in students]
top = max(students, key=lambda s: s["avg"])
print("-" * 35)
print(f"全体平均:{sum(all_avgs)/len(all_avgs):.1f}点")
print(f"最高評価:{top['name']} さん(平均 {top['avg']:.1f}点 / {top['rank']}ランク)")
▶ 出力結果
名前 国語 数学 英語 平均 ランク ----------------------------------- 田中 82 91 78 83.7 A 鈴木 95 67 88 83.3 A 佐藤 73 85 92 83.3 A 高橋 61 72 65 66.0 C ----------------------------------- 全体平均:79.1点 最高評価:田中 さん(平均 83.7点 / Aランク)
🔍 解説ポイント
- 各学生の辞書に
avgとrankキーを後から追加することでデータを拡張している max(students, key=lambda s: s["avg"])でリスト内の辞書を比較して最大値を取り出しているf"{name:<6}"・f"{score:>4}"で列の幅を揃えて表形式にしている
