リストの追加と削除
1 件増えるたびに書き直すのはつらい
おこづかい帳の記録は、買い物のたびに 1 件増えます。増えるたびにリストの中身を書き直していては、プログラムにする意味がありません。すでにあるリストのうしろに値を 1 つ足す道具が append です。
Python
items = ["りんご", "みかん"]
items.append("ノート")
print(items)['りんご', 'みかん', 'ノート'] と表示されます。リスト.append(値) のようにドットでつないで呼ぶ形を メソッド と呼びます。
気をつける点が 1 つあります。append は元のリストを書き換えるだけで、新しいリストを返しません。new = items.append("ノート") と書くと new には None が入ります。追加した結果を使いたいときは、append を呼んだあとの items を見ます。
何番目にあるかなんて覚えていない
打ち間違えた記録を消したいとき、それが何番目かを数えるのは面倒です。remove は位置ではなく 値 を指定して消します。
Python
basket = ["パン", "牛乳", "パン"]
basket.remove("パン")
print(basket)['牛乳', 'パン'] になります。消えるのは最初に一致した 1 件だけで、同じ値がもう 1 つ残っていても全部は消えません。
無い値を指定すると ValueError が起きて、そこでプログラムが止まります。止めたくなければ、消す前に in で入っているかどうかを確かめます。
Python
if "たまご" in basket:
basket.remove("たまご")in は第 3 章で条件式に使ったものと同じです。リストに対しては値の有無を調べます。
渡したリストが、呼び出し元でも変わっている
append と remove の「元を書き換える」という性質は、関数に渡したときにはっきり表に出ます。
Python
def add_tag(tags, tag):
tags.append(tag)
tags = ["下書き"]
add_tag(tags, "公開")
print(tags)['下書き', '公開'] と出ます。add_tag は何も return していないのに、呼び出した側の tags が増えています。リストを渡すと、中身の写しではなく 同じ入れ物そのもの が渡るからです。関数の中で書き換えれば、外にも同じ変化が起きます。
便利でもあり、事故のもとでもあります。元の並びを残しておきたいときは、書き換える前に別のリストを用意します。
やってみよう
関数 manage_list(items, add_item, remove_item) を実装してください。items の末尾に add_item を追加し、そのあと remove_item がリストに入っているときだけ 1 件取り除いて、最後のリストを return します。
remove_item が入っていないときは何も消さず、追加だけした状態を返します。追加してから削除する、という順番も守ってください。
要件
- 関数名は manage_list で、引数は items と add_item と remove_item の3つ
- 先に add_item を append でリストの末尾に追加する
- remove_item がリストに含まれているときだけ remove で1件削除する
- 最後のリストを return する