辞書を走査
for に辞書を渡すと、キーしか出てこない
辞書を作れるようになると、次は中身を全部たどりたくなります。ところが辞書をそのまま for に渡すと、取れるのはキーだけです。
Python
stock = {"鉛筆": 8, "消しゴム": 3}
for key in stock:
print(key)鉛筆 と 消しゴム の 2 行が出ます。値がほしければ stock[key] と書いて取りに行くことになり、1 周ごとに二度手間です。
items() を付けると、キーと値が組で取れます。for の変数を 2 つ書くのがポイントです。
Python
for label, count in stock.items():
print(label, count + 1)1 周目は label が "鉛筆" で count が 8、2 周目は "消しゴム" と 3 になります。値に 1 を足して表示しているので、表示は 鉛筆 9 と 消しゴム 4 です。enumerate や zip と同じ、変数を 2 つ並べて受け取る書き方です。
items() を付けずに for key, value in stock と書くと、キーの文字列を 2 つに分けようとしてしまいます。キーの文字数によっては ValueError で止まり、分けられてもキーと値の組にはなりません。
なお、辞書は 入れた順 を保ちます。作ったときの並びのまま取り出せるので、同じ辞書からは毎回同じ順の結果が得られます。
行の終わりに、余計な改行が残る
取り出した組を 1 行ずつの文字列にまとめるとき、ループの中で + "\n" を足していくと、最後の行にも改行が付いてしまいます。行数と改行の数が 1 つずれる、定番のつまずきです。
join を使えば起きません。要素と要素の あいだ にだけ区切りを挟むからです。
Python
print("\n".join(["1 行目", "2 行目"]))2 行が出て、末尾に空行は付きません。要素が 1 つなら区切りは入らず、空のリストを渡すと空文字 "" が返ります。
書く順番に注意します。"区切り".join(リスト) で、つなぐ側が主語です。リスト.join("\n") は逆でエラーになります。
行の中身は f-string で組み立てるのが楽です。+ でつなぐと "name" + " = " + 120 のところで TypeError になりますが、f-string の中なら int も自動で文字列として埋め込まれるので str() は要りません。
やってみよう
関数 record_lines(record) を実装してください。record を items() で走査し、1 組ごとに キー = 値 という文字列を作って、用意済みのリスト lines に追加します。
= の前後には半角スペースを 1 つずつ入れます。最後に join_lines(lines) の結果を return してください。この補助関数が改行の連結を担当し、末尾には改行を付けず、空のリストなら空文字を返します。キーと値を取り出すループと行の作成を自分で書きましょう。並びは辞書に入っている順のままです。
要件
- 関数名は record_lines で、引数は record の1つ
- items() でキーと値を同時に取り出して走査する
- f-string で「キー = 値」の行を作り、lines に append する。= の前後は半角スペース1つ
- join_lines(lines) の結果を return する。順序を保ち、末尾の改行は付けない