辞書を走査
for に辞書を渡すと、キーしか出てこない
辞書を作れるようになると、次は中身を全部たどりたくなります。ところが辞書をそのまま for に渡すと、取れるのはキーだけです。
Python
record = {"name": "りんご", "price": 120}
for key in record:
print(key)name と price の 2 行が出ます。値がほしければ record[key] と書いて取りに行くことになり、1 周ごとに二度手間です。
items() を付けると、キーと値が組で取れます。for の変数を 2 つ書くのがポイントです。
Python
for key, value in record.items():
print(key, value)1 周目は key が "name" で value が "りんご"、2 周目は "price" と 120 になります。enumerate や zip と同じ、変数を 2 つ並べて受け取る書き方です。
items() を付けずに for key, value in record と書くと ValueError になります。1 周で 1 つしか返ってこないものを、2 つに分けようとするからです。
なお、辞書は 入れた順 を保ちます。作ったときの並びのまま取り出せるので、同じ辞書からは毎回同じ順の結果が得られます。
行の終わりに、余計な改行が残る
取り出した組を 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 組ごとに キー = 値 という 1 行を作り、改行 \n でつないだ文字列を return します。
= の前後には半角スペースを 1 つずつ入れます。末尾に改行は付けません。空の辞書 {} を渡されたときは空文字 "" を返してください。並びは辞書に入っている順のままにし、並べ替えはしません。
要件
- 関数名は record_lines で、引数は record の1つ
- items() でキーと値を同時に取り出して走査する
- 1行は「キー = 値」の形で、= の前後に半角スペースを1つずつ入れる
- 行の区切りは改行で、末尾には改行を付けない。空の辞書のときは空文字を返す