台帳を保存・復元せよ
師範 / 目安 35分
松田さんが青い顔で事務局に駆け込んできました。「昨日、商店街が停電してな。パソコンの電源がぱちんと落ちて…あのとき台帳を打ち込んどったら、全部消えとったんじゃないか」。手書きの帳面には無かった不安です。「頼む、ファイルに残して、次に開いたときちゃんと読み込めるようにしてくれんかね」
ここからが師範の段です。プログラムは終われば消えます。消えないのはファイルに書いたものだけです。今回は、会員データをファイルに書き出し、そのファイルを読み直して元の形に戻すところまでを、1つの関数の中で通します。書けただけでは半分で、読み直して元通りになって初めて保存できたと言えます。
完成条件
save_and_load(members) という関数を定義してください。
membersは{"name": "田中はじめ", "points": 1200}の形の辞書を並べたリストです- 中身を
ledger.txtというファイルに書き出します。書き込みは上書きモードで開いてください - 1行に1会員、
名前,ポイントの形にします - 書き終えたら同じファイルを開き直して読み込み、
membersと同じ形の辞書のリストに戻して返します - ポイントはファイルから読むと文字列になります。整数に戻してください
- 空行は読み飛ばします
返す値は、渡したリストと同じ並び・同じ中身でなければいけません。
進め方
白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。
書き込みを追記モードにすると、呼ばれるたびに行が積み上がって、2回目から答えが合わなくなります。毎回まっさらから書き直すモードを選んでください。
要件
- save_and_load(members) を定義する。members は {"name": ..., "points": ...} の辞書のリスト
- ledger.txt を上書きモードで開き、1行に1会員を「名前,ポイント」の形で書く
- 書き終えたら同じファイルを開き直して読み込む
- 読んだ行を分解し、ポイントを int に戻して辞書に組み立てる
- 空行は読み飛ばす
- 復元したリストを return する。並びも中身も元と同じにする
入出力例
save_and_load([{"name":"田中はじめ","points":1200},{"name":"佐藤みどり","points":480}]) → [{"name":"田中はじめ","points":1200},{"name":"佐藤みどり","points":480}]
save_and_load([{"name":"鈴木たけし","points":0}]) → [{"name":"鈴木たけし","points":0}]
save_and_load([{"name":"松田さだお","points":999},{"name":"山口あゆみ","points":1000},{"name":"中村けいた","points":500},{"name":"小林ひかる","points":3200}]) → [{"name":"松田さだお","points":999},{"name":"山口あゆみ","points":1000},{"name":"中村けいた","points":500},{"name":"小林ひかる","points":3200}]
save_and_load([]) → []ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部