リストの追加と削除
このレッスンで作るもの — リストに値を足す
append、取り除くremove、件数を数えるlenを正式に覚えます。
リストの追加と削除
第 5 章のループでは、すでにリストを何度も使ってきました。for record in records と書いて中身を 1 件ずつ取り出す、あの records がリストです。ただ、リストそのものを増やしたり減らしたりする方法は、まだきちんと扱っていません。ここで正面から覚えます。
おこづかい帳は「支出が 1 件増えた」「打ち間違えたから 1 件消したい」「今何件あるか知りたい」の 3 つができて、はじめて道具になります。それぞれに対応するのが append と remove と len です。
リストは順番を保ったまま、いくつでも値を並べておける入れ物です。あとから中身を増減できるのが、この章でいちばん大事な性質です。
append で末尾に追加する
append はリストの いちばんうしろ に値を 1 つ足します。書き方は リスト.append(値) です。ドットでつないで呼び出すこの形を メソッド と呼びます。
items = ["りんご", "みかん"]
items.append("ノート")
print(items)表示は ['りんご', 'みかん', 'ノート'] です。第 5 章や第 6 章で合計を数えるときに使った append は、これと同じものでした。
ここで見落としやすいのは、append が 元のリストそのものを書き換える という点です。新しいリストを作って返すのではありません。
items = ["りんご"]
new_items = items.append("みかん")
print(new_items)new_items には None が入ります。append の戻り値は None だからです。追加した結果を使いたいときは、append を呼んだあとの items を見ます。
remove で値を取り除く
remove は指定した値と 最初に一致した 1 件 をリストから消します。位置ではなく値で指定するのが特徴です。
items = ["りんご", "みかん", "ノート"]
items.remove("みかん")
print(items)表示は ['りんご', 'ノート'] になります。同じ値が 2 つ入っている場合、消えるのは前にある 1 つだけで、全部は消えません。
len で件数を数える
len はメソッドではなく組み込みの関数で、len(リスト) と書きます。中身がいくつあるかを int で返します。
items = ["りんご", "みかん"]
print(len(items))2 と表示されます。空のリスト [] なら len([]) は 0 です。件数の表示にも、条件分岐にも使えます。
動きを追ってみる
["りんご", "みかん"] に "ノート" を足し、"りんご" を消す流れを追います。
- 最初のリストは
["りんご", "みかん"]でlenは2 items.append("ノート")で["りんご", "みかん", "ノート"]になりlenは3items.remove("りんご")で["みかん", "ノート"]になりlenは2
追加は末尾に入り、削除しても残りの順番は変わりません。リストは順番を守り続けます。
「消えたのに順番が崩れない」のはリストの大事な性質です。あとで学ぶ
setは順番を持たないので、ここが決定的な違いになります。
よくある間違い
- 無い値を
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 回呼びます。
ValueErrorは「値がおかしい」という意味の例外です。第 8 章でtryを使って受け止める方法を学びますが、今の段階ではinで事前に確認するほうが読みやすく書けます。
やってみよう
関数 manage_list(items, add_item, remove_item) を実装してください。リスト items に add_item を append で追加し、そのあと remove_item がリストに含まれていれば remove で 1 件取り除いて、最後のリストを return します。
remove_item がリストに無いときは何も消さず、追加だけした状態を返します。remove をいきなり呼ぶと ValueError で落ちるので、in で確認してから呼んでください。追加してから削除する、という順番も守ります。
要件
- 関数名は manage_list で、引数は items と add_item と remove_item の3つ
- 先に add_item を append でリストの末尾に追加する
- remove_item がリストに含まれているときだけ remove で1件削除する
- 最後のリストを return する
入出力例
manage_list(["りんご","みかん"], "ノート", "りんご") → ["みかん","ノート"]
manage_list(["りんご"], "ノート", "バナナ") → ["りんご","ノート"]
manage_list([], "ノート", "ノート") → []
manage_list(["りんご","りんご"], "みかん", "りんご") → ["りんご","みかん"]
manage_list(["電車代","牛乳"], "ペン", "ペン") → ["電車代","牛乳"]