概要(map は「全要素に同じ処理」を適用して返す)
map は、リストやタプルなどの各要素に「指定した関数」を適用し、その結果を順に返す組み込み関数です。戻り値は「map オブジェクト」(イテレータ)で、必要に応じて list(…) や tuple(…) に変換して中身を取り出します。for ループを書かずに一括処理できるため、コードを短く読みやすくできます。
def double(x):
return x * 2
nums = [1, 2, 3]
it = map(double, nums) # map オブジェクト(イテレータ)
print(list(it)) # [2, 4, 6]
Python基本構文と挙動(ここが重要)
基本の書式と戻り値
書式は map(function, iterable, …) です。第一引数の function に各要素を渡して処理し、結果を順に返します。戻り値はイテレータであり、1回使い切りです。結果を複数回使いたいときは list(…) に一度変換してから使うと安全です。
texts = ["10", "20", "30"]
it = map(int, texts) # intを各要素に適用
print(list(it)) # [10, 20, 30]
# print(list(it)) # すでに使い切りのため、ここは空になる
Python関数に渡す引数の数は「iterable の数」と一致
map は複数の iterable を受け取れます。function が引数を2つ受け取るなら、map にも2つの iterable を渡します。どちらかが先に尽きると、その時点で終了します。
a = [1, 2, 3]
b = [10, 20, 30]
def add(x, y): return x + y
print(list(map(add, a, b))) # [11, 22, 33]
Pythonよく使うパターン(型変換・文字列処理・辞書/ネスト処理)
型変換や前処理を一括で行う
文字列を数値に、None を 0 に、空白をトリムするなど、定型の前処理に向きます。標準関数(int/float/str)や自作関数をそのまま渡せます。
rows = [" 10 ", " 20", "30 "]
clean = list(map(lambda s: int(s.strip()), rows))
print(clean) # [10, 20, 30]
Python文字列加工や大小変換
文字列の大文字・小文字化、プレフィックス追加などを一行でまとめられます。
names = ["apple", "Banana", "CHERRY"]
print(list(map(str.lower, names))) # ['apple', 'banana', 'cherry']
print(list(map(lambda s: f"item:{s}", names))) # ['item:apple', ...]
Python辞書の配列から特定フィールドを取り出す
辞書のリストの「フィールド抽出」や「値の加工」を直感的に書けます。
products = [
{"name": "coffee", "price": 350},
{"name": "tea", "price": 280},
]
names = list(map(lambda p: p["name"], products))
prices_with_tax = list(map(lambda p: round(p["price"] * 1.1), products))
print(names) # ['coffee', 'tea']
print(prices_with_tax) # [385, 308]
Pythonmap と内包表記の使い分け(重要ポイントを深掘り)
可読性と柔軟性の比較
内包表記は「式+条件」を自然に書け、Python では非常によく使われます。map は「既存関数を当てたい」「複数 iterable を関数へ渡したい」場面で特に読みやすくなります。条件付きや複雑な式変換が多いなら内包表記がわかりやすく、単純な関数適用なら map が短くなります。
nums = [1, 2, 3, 4]
# map:関数適用
print(list(map(lambda x: x * 2, nums))) # [2, 4, 6, 8]
# 内包表記:条件付き
print([x * 2 for x in nums if x % 2 == 0]) # [4, 8]
Python複数 iterable を扱うなら map が素直
内包表記で zip を使うより、関数の引数に素直に渡せる map のほうが意図が明確になります。
a = ["x", "y", "z"]
b = [1, 2, 3]
def combine(s, n): return f"{s}-{n}"
print(list(map(combine, a, b))) # ['x-1', 'y-2', 'z-3']
Pythonつまずきやすい点と安全策(イテレータ・引数不一致・例外処理)
map オブジェクトは「遅延評価」で一度きり
map は必要になるまで計算しません(遅延)。一度 list(…) や for で消費すると再利用できません。再利用したいなら、最初に list にして持っておくか、必要なタイミングで再度 map を作り直します。
it = map(lambda x: x * 2, [1, 2, 3])
print(list(it)) # [2, 4, 6]
# ここで it は空。必要なら再度 map(...) を作る
Pythonfunction と iterable の「引数の数」を揃える
関数が2引数なら、map にも2つの iterable を渡します。不一致だと TypeError になります。多引数関数には複数の iterable を、可変長ならアンパックを適切に扱います。
def add3(a, b, c): return a + b + c
print(list(map(add3, [1,2], [10,20], [100,200]))) # [111, 222]
Python例外が起こる処理を安全に包む
int(…) で不正文字を変換すると ValueError。安全にしたければ try/except を関数内に組み込みます。
def to_int_safe(s):
try:
return int(s)
except ValueError:
return 0
data = ["10", "x", "25"]
print(list(map(to_int_safe, data))) # [10, 0, 25]
Python実用例と応用(前処理・正規化・重み付け計算)
前処理のチェーンを段階的に適用
strip → lower → 末尾の「s」を削除、のように関数を段階的に適用して整えます。読みやすさ重視なら関数を分けると良いです。
def normalize(s):
s = s.strip().lower()
return s[:-1] if s.endswith("s") else s
texts = [" Apples ", "TEA", " coffees"]
print(list(map(normalize, texts))) # ['apple', 'tea', 'coffee']
Python数値の正規化や重み付け
合計で割る正規化や、重みを掛けるなどの加工を簡潔に書けます。
scores = [80, 70, 90]
total = sum(scores)
weights = list(map(lambda s: s / total, scores))
print([round(w, 3) for w in weights]) # [0.364, 0.318, 0.409]
Pythonネスト構造の加工を一列で整形
辞書の配列を整形して、別形式へマッピングします。
rows = [
{"item": "coffee", "price": 350, "qty": 2},
{"item": "tea", "price": 280, "qty": 1},
]
summaries = list(map(lambda r: f'{r["item"]}:{r["price"]*r["qty"]}', rows))
print(summaries) # ['coffee:700', 'tea:280']
Pythonまとめ
map は「関数を全要素に適用する」ための基本ツールで、戻り値は遅延評価のイテレータです。標準関数や自作関数、lambda と組み合わせて、型変換・文字列処理・辞書配列の整形・複数 iterable の同時処理まで短く書けます。内包表記とは使い分けが肝心で、単純な関数適用や多引数関数には map が読みやすく、条件付きや複雑な式変換には内包表記が自然です。イテレータの一度きり性、引数の数の一致、例外の安全化を押さえれば、初心者でもスッと使いこなせます。
