map
このレッスンでできるようになること。map を使って、支出リストの全要素を同じルールで別の値へ変換できるようになります。
map(関数, リスト) は、リストの要素を1つずつ関数に渡し、その戻り値を順に取り出せるものを返します。前のレッスンで見たとおり、渡すのは関数オブジェクトなのでカッコは付けません。
amounts = [220, 640, 1280]
print(list(map(str, amounts))) # ['220', '640', '1280']ここで大事なのは list() です。map が返すのは map オブジェクトという「これから順に作る」入れ物で、そのまま print すると map object at 0x... のような素っ気ない表示になります。結果をリストとして扱いたいときは必ず list() に通してください。しかも map オブジェクトは一度使い切ると空になるため、二度目のループでは何も出てきません。早めに list へ固めるのが安全です。
短い変換なら、その場で名前の無い関数を書ける lambda が便利です。lambda 引数: 式 と書くと、式の値を返す関数オブジェクトになります。
amounts = [220, 640, 1280]
taxed = list(map(lambda a: a * 110 // 100, amounts))
print(taxed) # [242, 704, 1408]税込金額は a * 1.1 でも計算できますが、そうすると 242.00000000000003 のような値が出ることがあります。家計簿の金額は円単位の整数で持ちたいので、110 を掛けてから 100 で整数除算する a * 110 // 100 の形にします。金額は int のまま扱う、と決めておくと表示も比較も揺れません。
要件
- map と lambda を使って変換する
- 税込金額は amount * 110 // 100 で計算し、int のまま返す
- map オブジェクトではなく list を返す
入出力例
tax_included_amounts([{"amount":220,"name":"牛乳"},{"amount":640,"name":"電車代"}]) → [242,704]
tax_included_amounts([{"amount":1280,"name":"コーヒー豆"},{"amount":165,"name":"ノート"},{"amount":2035,"name":"書籍"}]) → [1408,181,2238]ヒント
編集 LuaGate編集部