無い値を remove する
["りんご"].remove("みかん") は ValueError になり、プログラムがそこで止まります。メッセージは list.remove(x): x not in list です。消す前に if "みかん" in items で存在を確かめるのが基本の対策です。
レッスンの本文で注意している点を、つまずきの側から27件ぶん並べ直しました。書いた覚えのある形が見つかったら、 そのままレッスンに戻って前後を読めます。
remove する["りんご"].remove("みかん") は ValueError になり、プログラムがそこで止まります。メッセージは list.remove(x): x not in list です。消す前に if "みかん" in items で存在を確かめるのが基本の対策です。
append の戻り値を受け取るitems = items.append("ノート") と書くと items が None になり、次の行で TypeError が出ます。append は呼ぶだけにします。
append に複数渡すitems.append("りんご", "みかん") はエラーです。append が受け取れるのは 1 つだけで、2 件足したいなら 2 回呼びます。
items[0:3] は 4 件ではなく 3 件です。「終了の手前まで」と覚えます。取れた件数が 1 つ足りない、多いと感じたらここを疑います。
items[-3] と items[-3:] を混同するコロンが無いと 1 件だけ、あるとリストが返ります。前者の戻り値は辞書や文字列、後者はリストです。
スライスで詳しく読むitems[0] を読む[] に対する items[0] は IndexError です。len(items) で件数を確かめるか、スライスを使えば避けられます。
record[name] と書くと、name という変数を探しに行ってしまいます。変数が無ければ NameError です。キーを直接書くときは record["name"] とクオートで囲みます。
record["memo"] は KeyError になります。in で確認するか、キーが無くても落ちない record.get("memo") を使います。get は無いとき None を返します。
[] はリスト、{} は辞書です。{"name", "price"} のようにコロンを書き忘れると、辞書ではなく別のものになります。
for key, value in record と書くitems() を付けずに 2 つ受け取ろうとすると ValueError になります。辞書をそのまま回すと 1 周ごとにキーが 1 つ返るだけなので、2 つに分けられません。
+ でつなぐときに int を混ぜるkey + " = " + value は value が 120 だと TypeError です。f-string を使うか str(value) で変換します。
ループの中で + "\n" を付けると最後の行にも改行が残ります。join を使えばこの問題は起きません。
key に呼び出し結果を渡すkey=lambda r: r["price"]() のようにかっこを足すと関数ではなくなります。渡すのは関数そのもので、呼ぶのは sorted の仕事です。
r["prise"] のようなつづり違いは KeyError になります。エラーメッセージに無いキー名がそのまま出るので、見比べれば分かります。
-1 などで表そうとする降順は reverse=True です。sorted(...)[::-1] でも見た目は逆順になりますが、同じ値どうしの並びが変わってしまうことがあるため reverse を使います。
return set(...) と書くと、順番が定まらないうえに型もリストではありません。テストの比較も安定しません。必ず sorted でリストにしてから返します。
{} と書く{} は空の 辞書 です。空の集合は set() です。type({}) を試すと dict と出ます。
集合には順番が無いので categories[0] は TypeError になります。取り出したいなら先にリストへ変換します。
append を書いてしまう[result.append(r) for r in records] と書くと、append の戻り値である None が並んだリストができます。内包表記の中では append は要りません。
if の位置を間違える絞り込みの if は for の うしろ です。前に書く [a if 条件 else b for ...] は第 3 章の三項演算子で、絞り込みではなく値の切り替えになります。
= を 1 つしか書かないif record["category"] = "食費" は SyntaxError です。比較は == で、代入の = とは別ものです。
3 つ入った組を name, price = pair で受けると ValueError になります。メッセージは too many values to unpack です。数を合わせるか、pair[0] のように番号で取ります。
("りんご") と書くこれはただの文字列です。要素が 1 つのタプルには ("りんご",) とカンマが必要です。
pair[1] = 150 は TypeError です。変えたいなら新しいタプルを作り直すか、最初からリストを使います。
KeyError存在確認をせずに足そうとすると、そのカテゴリが初めて出てきた時点で止まります。in で確認するか、無いとき 0 を返す totals.get(category, 0) を使います。
0 のキーを入れてしまう5 カテゴリ分を先に 0 で埋めると、使っていないカテゴリまで結果に残ります。この仕様では入れません。
値は int です。str にすると "120180" のような連結になり、金額として使えなくなります。