enumerateで番号付け
何周目かを数えるためだけの変数
おこづかい帳の一覧をただ並べるだけでは、「何件目を消したいのか」を伝えられません。行の頭に番号が振ってあれば、あとから「2 番を削除」と指示できます。
番号を振るには、いまが何周目なのかを知る必要があります。素直に書くと、番号のための変数を自分で用意して、毎周 1 ずつ足すことになります。
Python
names = ["りんご", "みかん", "パン"]
i = 1
for name in names:
print(i, name)
i = i + 1動きはしますが、i = 1 と i = i + 1 という「番号の世話」がループの本題に混ざっています。初期化と更新のどちらかを書き忘れれば、番号だけが狂います。
番号は 0 から始まる
enumerate にリストを渡すと、番号と要素の 2 つ組 を順に出してくれます。
Python
for i, name in enumerate(names):
print(i, name)0 りんご、1 みかん、2 パン と表示されます。for のうしろに名前を 2 つカンマで並べているところが新しい点です。出てきた 2 つ組が、順番どおりに i と name へ割り当てられます。番号の世話をする 2 行が丸ごと消えました。
ただし番号は既定で 0 から始まります。人に見せる一覧は 1 から始めたいので、2 つ目の引数で開始番号を指定します。
Python
for i, name in enumerate(names, 1):
print(i, name)これで 1 りんご から始まります。enumerate(names, 1) の 1 が開始番号です。
区切りは行のうしろではなく手前に足す
このコースの採点は戻り値を見るので、print ではなく 1 本の文字列を返します。ここで問題になるのが、行と行のあいだにだけ区切りを入れ、末尾には付けない、という点です。
Python
line = ""
for word in ["赤", "青", "緑"]:
if line != "":
line = line + "、"
line = line + word
print(line)赤、青、緑 が出ます。まだ 1 件も入っていないときは区切りを足さず、2 件目以降のときだけ 手前に 足しています。うしろに足す形にすると、最後の 1 件のあとにも区切りが残ってしまいます。
末尾の余分な改行は、画面で見ても区別がつきません。テストが落ちて原因が分からないときに、最初に疑うのがここです。
やってみよう
関数 numbered_list(names) を実装してください。引数 names は品名 (str) が並んだリストです。
1 から始まる通し番号を振り、"1. りんご" の形に整えた行を、改行 \n でつないだ 1 本の文字列を return します。番号のうしろは半角ドットと半角スペース 1 つです。末尾に改行は付けません。
numbered_list(["りんご", "みかん"]) の答えは "1. りんご\n2. みかん" です。空のリストのときは空文字 "" を返します。番号は数値なので、str で文字列に変えてからつなぎます。
要件
- 関数名は numbered_list で、引数はリスト names の1つだけにする
- enumerate を使い、番号は 1 から始める
- 各行は "1. りんご" のように番号、半角ドット、半角スペース1つ、品名の順にする
- 行の区切りは \n を使い、末尾には改行を付けない
入出力例
numbered_list(["りんご","みかん","パン"]) → "1. りんご
2. みかん
3. パン"
numbered_list(["りんご","みかん"]) → "1. りんご
2. みかん"
numbered_list(["りんご"]) → "1. りんご"
numbered_list(["りんご","みかん","パン","牛乳","たまご"]) → "1. りんご
2. みかん
3. パン
4. 牛乳
5. たまご"
numbered_list([]) → ""