辞書の基本
このレッスンで作るもの — 名前を付けて値をしまう 辞書 を覚えて、支出 1 件を
{"name": ..., "price": ..., "category": ...}の形で作ります。
辞書の基本
リストは値を順番で管理します。records[0] のように番号で取り出す仕組みでした。これに対して 辞書 は、番号ではなく 名前 で値を取り出します。
支出 1 件を考えます。品名と金額とカテゴリの 3 つをリストで持つと ["りんご", 120, "食費"] になりますが、これでは [1] が金額なのかカテゴリなのか、コードを読んだだけでは分かりません。辞書ならこうなります。
record = {"name": "りんご", "price": 120, "category": "食費"}record["price"] と書けば金額が取れます。番号を覚える必要がなく、読んだ瞬間に意味が分かります。
番号で並べるならリスト、名前で引くなら辞書です。おこづかい帳の 1 件のように「項目名が決まっているもの」は辞書の出番です。
書き方を確認する
辞書は波かっこ {} で囲み、キー: 値 の組をカンマで並べます。左側を キー、右側を 値 と呼びます。
record = {"name": "ノート", "price": 200, "category": "日用品"}
print(record["name"])
print(record["price"])ノート と 200 が表示されます。キーは文字列にするのが基本で、クオートで囲みます。値の型は自由で、上の例では name と category が str、price が int です。
空の辞書は {} と書きます。空のリスト [] と見た目が近いので混同しないよう気をつけます。
あとから追加・変更する
存在しないキーに代入すると 追加、すでにあるキーに代入すると 上書き になります。同じ書き方で両方が起きます。
record = {}
record["name"] = "牛乳"
record["price"] = 180
record["price"] = 200最後の行で price は 200 に上書きされます。辞書に同じキーを 2 つ持つことはできず、あとから書いたほうだけが残ります。
動きを追ってみる
make_record("りんご", 120, "食費") が辞書を組み立てる流れを追います。
{}の中に"name": nameと書き、引数のnameの値である"りんご"が入る- 同じように
"price": priceで120が入る "category": categoryで"食費"が入る- できた辞書
{"name": "りんご", "price": 120, "category": "食費"}をreturnする
キーの "name" はクオート付きの文字列、値の name はクオート無しの変数です。この 2 つが並ぶので、慣れるまでは見比べて確認します。
{"name": name}の左右は別物です。左はキーという名札、右は引数に入っている中身です。同じつづりでも役割が違います。
キーの有無を確かめる
無いキーを読むと KeyError で止まります。in を使えば事前に確認できます。
record = {"name": "りんご", "price": 120}
print("price" in record)
print("category" in record)True と False が出ます。第 3 章で学んだ in が、辞書ではキーの有無を調べる働きになります。
辞書に対する
inはキーだけを見ます。値のほうは見ないので、120 in recordはFalseです。
よくある間違い
- キーのクオートを忘れる —
record[name]と書くと、nameという変数を探しに行ってしまいます。変数が無ければNameErrorです。キーを直接書くときはrecord["name"]とクオートで囲みます。 - 無いキーを読む —
record["memo"]はKeyErrorになります。inで確認するか、キーが無くても落ちないrecord.get("memo")を使います。getは無いときNoneを返します。 - リストと辞書のかっこを取り違える —
[]はリスト、{}は辞書です。{"name", "price"}のようにコロンを書き忘れると、辞書ではなく別のものになります。
やってみよう
関数 make_record(name, price, category) を実装してください。3 つの引数から {"name": 品名, "price": 金額, "category": カテゴリ} という辞書を作って return します。
1 つだけ条件があります。category が空文字 "" のときは、代わりに "その他" を入れてください。第 4 章で学んだ「未入力ならその他」の考え方を、辞書の中で使う形です。キーの並びは name、price、category の順にします。
要件
- 関数名は make_record で、引数は name と price と category の3つ
- キーは name と price と category の3つを持つ辞書を return する
- category が空文字のときは値を "その他" にする
- キーの並びは name、price、category の順にする
入出力例
make_record("りんご", 120, "食費") → {"category":"食費","name":"りんご","price":120}
make_record("ふしぎな買い物", 500, "") → {"category":"その他","name":"ふしぎな買い物","price":500}
make_record("試供品", 0, "日用品") → {"category":"日用品","name":"試供品","price":0}
make_record("電車代", 320, "交通費") → {"category":"交通費","name":"電車代","price":320}
make_record("映画", 1800, "娯楽") → {"category":"娯楽","name":"映画","price":1800}