Pythonコレクションのよくある間違い

レッスンの本文で注意している点を、つまずきの側から27件ぶん並べ直しました。書いた覚えのある形が見つかったら、 そのままレッスンに戻って前後を読めます。

リストの追加と削除

レッスンを読む

無い値を remove する

["りんご"].remove("みかん")ValueError になり、プログラムがそこで止まります。メッセージは list.remove(x): x not in list です。消す前に if "みかん" in items で存在を確かめるのが基本の対策です。

リストの追加と削除で詳しく読む

append の戻り値を受け取る

items = items.append("ノート") と書くと itemsNone になり、次の行で TypeError が出ます。append は呼ぶだけにします。

リストの追加と削除で詳しく読む

終了位置を含むと思い込む

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 + " = " + valuevalue120 だと TypeError です。f-string を使うか str(value) で変換します。

辞書を走査で詳しく読む

末尾に改行を足してしまう

ループの中で + "\n" を付けると最後の行にも改行が残ります。join を使えばこの問題は起きません。

辞書を走査で詳しく読む

keyでソート

レッスンを読む

key に呼び出し結果を渡す

key=lambda r: r["price"]() のようにかっこを足すと関数ではなくなります。渡すのは関数そのもので、呼ぶのは sorted の仕事です。

keyでソートで詳しく読む

キーの名前を間違える

r["prise"] のようなつづり違いは KeyError になります。エラーメッセージに無いキー名がそのまま出るので、見比べれば分かります。

keyでソートで詳しく読む

降順を -1 などで表そうとする

降順は reverse=True です。sorted(...)[::-1] でも見た目は逆順になりますが、同じ値どうしの並びが変わってしまうことがあるため reverse を使います。

keyでソートで詳しく読む

setで重複除去

レッスンを読む

集合をそのまま返す

return set(...) と書くと、順番が定まらないうえに型もリストではありません。テストの比較も安定しません。必ず sorted でリストにしてから返します。

setで重複除去で詳しく読む

番号で取り出そうとする

集合には順番が無いので categories[0]TypeError になります。取り出したいなら先にリストへ変換します。

setで重複除去で詳しく読む

リスト内包表記

レッスンを読む

append を書いてしまう

[result.append(r) for r in records] と書くと、append の戻り値である None が並んだリストができます。内包表記の中では append は要りません。

リスト内包表記で詳しく読む

if の位置を間違える

絞り込みの iffor の うしろ です。前に書く [a if 条件 else b for ...] は第 3 章の三項演算子で、絞り込みではなく値の切り替えになります。

リスト内包表記で詳しく読む

タプルアンパック

レッスンを読む

要素の数が合わない

3 つ入った組を name, price = pair で受けると ValueError になります。メッセージは too many values to unpack です。数を合わせるか、pair[0] のように番号で取ります。

タプルアンパックで詳しく読む

タプルを書き換えようとする

pair[1] = 150TypeError です。変えたいなら新しいタプルを作り直すか、最初からリストを使います。

タプルアンパックで詳しく読む

つくる:カテゴリ別集計

レッスンを読む

初回の KeyError

存在確認をせずに足そうとすると、そのカテゴリが初めて出てきた時点で止まります。in で確認するか、無いとき 0 を返す totals.get(category, 0) を使います。

つくる:カテゴリ別集計で詳しく読む