タプルアンパック
pair[0] と pair[1] では、何が入っているのか分からない
2 つの値をひとまとめに持ち運びたいとき、丸かっこで並べた形が使えます。これが タプル です。
Python
point = (10, 20)
print(point[0])
print(point[1])10 と 20 が出ます。番号で取り出せるところはリストと同じですが、point[0] = 30 のように書き換えることはできず、TypeError になります。作ったら変えない、という約束が型として表れています。
とはいえ、番号で取り出すコードは読み返したときに何番が何なのか分かりません。タプルの本当の便利さは、変数に分けて受け取れる ところにあります。
Python
x, y = point左辺にカンマで変数を 2 つ並べると、x に 10、y に 20 が入ります。これを アンパック と呼びます。名前が付くので、以降のコードが読めるものになります。第 6 章で作った 2 つの値を返す関数を total, average = ... と受け取れたのも、同じ仕組みでした。
1 周ごとに [0] と [1] を書き続けたくない
組が並んだリストを回すとき、for の変数を 2 つ書けば、1 周ごとに自動でアンパックされます。
Python
sizes = [("S", 1), ("M", 2), ("L", 3)]
for label, number in sizes:
print(label, number)S 1、M 2、L 3 と出ます。前に使った enumerate や items() も、返していたのは「2 つの値の組」でした。同じ仕組みが名前を変えて何度も出てきているだけです。
アンパックはリストにも効きます。["S", 1] のような 2 要素のリストでも同じように分解できます。分解できるかどうかは、タプルかリストかではなく 要素の数が合っているか で決まります。
数が合わないと ValueError になり、メッセージに unpack という単語が出ます。この単語を見たら、受け取る変数の数と組の中身の数を数え直します。
やってみよう
関数 unpack_pairs(pairs) を実装してください。pairs は ["品名", 金額] という 2 要素の組が並んだリストです。1 組ずつアンパックして受け取り、"品名 金額円" という文字列を作り、それを集めた リスト を return します。
for の変数を 2 つ書く形で分解してください。品名と金額の間は半角スペース 1 つ、金額のうしろに 円 を付けます。金額は int ですが、f-string の中に書けば str() は要りません。
戻り値はタプルではなくリストです。この学習環境の判定はリスト形式で行うためで、手元で試すときはタプルのままでも構いません。空リストのときは空リスト [] を返します。
要件
- 関数名は unpack_pairs で、引数は pairs の1つ
- for name, price in pairs の形でアンパックして受け取る
- 1組ごとに "品名 金額円" の文字列を作る。品名と金額の間は半角スペース1つ
- 文字列を集めたリストを return する。並び順は元のままにする
入出力例
unpack_pairs([["りんご",120],["バス代",220]]) → ["りんご 120円","バス代 220円"]
unpack_pairs([["映画",1800]]) → ["映画 1800円"]
unpack_pairs([]) → []
unpack_pairs([["試供品",0],["ノート",200]]) → ["試供品 0円","ノート 200円"]
unpack_pairs([["電車代",320],["牛乳",180],["ペン",150]]) → ["電車代 320円","牛乳 180円","ペン 150円"]