Pythonの学習を進める中で、map()関数とzip()関数がよく同じ章に登場することに気づきました。
どちらも複数の要素をまとめて処理する場面で使われるため、整理して覚えておきたいと思い、この記事をまとめました。
map()関数とは?
map()関数は、指定した関数を、リストなどの各要素に1つずつ適用するための関数です。
また、複数のイテラブル(リストなど)を渡すと、それぞれの要素を順番に取り出して、関数の引数として渡すことができます。
基本構文
map(関数, イテラブル1, [イテラブル2, ...])
戻り値は map オブジェクト(イテレータ)です。結果をすぐに使いたいときは、list()で明示的にリスト化します。
単一のイテラブルに対して使う例
nums = [1, 2, 3, 4, 5]
result = map(lambda x: x * 2, nums)
print(list(result)) # [2, 4, 6, 8, 10]
複数のイテラブルに対して使う例
l1 = [1, 2, 3]
l2 = [4, 5, 6]
result = map(lambda x, y: x * y, l1, l2)
print(list(result)) # [4, 10, 18]
この場合、lambda x, y: の x には l1 の要素が、y には l2 の要素がそれぞれ順番に渡されます。
| 回数 | x (l1) |
y (l2) |
x * y |
|---|---|---|---|
| 1 | 1 | 4 | 4 |
| 2 | 2 | 5 | 10 |
| 3 | 3 | 6 | 18 |
zip()関数とは?
zip()関数は、複数のイテラブルの要素を対応づけて、タプルとしてまとめるための関数です。
基本構文
zip(イテラブル1, イテラブル2, ...)
戻り値は zip オブジェクト(イテレータ)です。必要に応じて list() などで取り出します。
使用例
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 90, 78]
zipped = zip(names, scores)
print(list(zipped))
# [('Alice', 85), ('Bob', 90), ('Charlie', 78)]
zip()は「対応する要素をタプルにまとめる」のに便利です。
map()とzip()の違いと使い分け
| 比較ポイント | map() | zip() |
|---|---|---|
| 主な目的 | 関数の適用 | データの結び付け |
| 戻り値 | mapオブジェクト | zipオブジェクト |
| 処理内容 | 関数を通して要素を変換する | 要素をタプルとしてまとめる |
どちらもイテレータを返すので、for文やlist()で中身を取り出す必要があります。
map()とzip()の組み合わせ例
2つのリストの要素を掛け合わせる処理を、zip()とmap()を組み合わせて書くこともできます。
l1 = [1, 2, 3]
l2 = [10, 20, 30]
result = map(lambda t: t[0] * t[1], zip(l1, l2))
print(list(result)) # [10, 40, 90]
このように、zip()でタプルにまとめてからmap()で処理することで、複数の引数を1つのタプルとして関数に渡すことができます。
おわりに
map()関数とzip()関数は、Pythonの繰り返し処理やデータ操作でとても役立ちます。
処理の目的やデータの形に応じて、適切に使い分けられるようになっていきたいです。