Python map関数の完全ガイド|初心者でもすぐに使える!

python

Pythonでリストの処理をするとき、こんなコードを書いたことはありませんか?

# 全ての数字を2倍にしたい
numbers = [1, 2, 3, 4, 5]
doubled = []
for num in numbers:
    doubled.append(num * 2)
print(doubled)  # [2, 4, 6, 8, 10]

このような「リストの全ての要素に同じ処理をする」作業は、map関数を使うともっと簡単に書けます。

map関数とは

  • リストの全ての要素に同じ処理を適用する関数
  • for文よりも短く、読みやすいコードが書ける
  • Pythonに最初から入っている便利な機能

この記事では、map関数の使い方を初心者にも分かりやすく説明します。

スポンサーリンク

map関数の基本的な使い方

基本の書き方

map(関数, リスト)

map関数の仕組み

  1. リストの要素を一つずつ取り出す
  2. 指定した関数に要素を渡して処理する
  3. 処理結果を新しいリストとして返す

最初の例

# 数字を2倍にする関数
def double(x):
    return x * 2

# map関数を使って全ての数字を2倍に
numbers = [1, 2, 3, 4, 5]
result = map(double, numbers)
doubled_list = list(result)

print(doubled_list)  # [2, 4, 6, 8, 10]

重要なポイント

  • map関数の結果は「mapオブジェクト」という特殊なもの
  • list() を使って普通のリストに変換する必要がある

lambda(ラムダ)式と組み合わせる

小さな処理なら、わざわざ関数を定義しなくても「lambda式」が使えます。

lambda式とは

# 普通の関数
def double(x):
    return x * 2

# lambda式(同じ意味)
lambda x: x * 2

lambda式は「その場で作る小さな関数」と考えてください。

map + lambdaの例

# 数字を2倍にする
numbers = [1, 2, 3, 4, 5]
doubled = list(map(lambda x: x * 2, numbers))
print(doubled)  # [2, 4, 6, 8, 10]

# 数字を2乗にする
squared = list(map(lambda x: x ** 2, numbers))
print(squared)  # [1, 4, 9, 16, 25]

# 文字列を大文字にする
words = ['hello', 'world', 'python']
upper_words = list(map(lambda x: x.upper(), words))
print(upper_words)  # ['HELLO', 'WORLD', 'PYTHON']

実際の使用例

例1:数値の変換

# 温度をセ氏から華氏に変換
celsius = [0, 20, 30, 40]
fahrenheit = list(map(lambda c: c * 9/5 + 32, celsius))
print(fahrenheit)  # [32.0, 68.0, 86.0, 104.0]

# 文字列を数値に変換
str_numbers = ['1', '2', '3', '4']
int_numbers = list(map(int, str_numbers))
print(int_numbers)  # [1, 2, 3, 4]

例2:文字列の処理

# 名前の最初を大文字にする
names = ['alice', 'bob', 'charlie']
capitalized = list(map(lambda name: name.capitalize(), names))
print(capitalized)  # ['Alice', 'Bob', 'Charlie']

# 文字列の長さを取得
words = ['cat', 'dog', 'elephant']
lengths = list(map(len, words))
print(lengths)  # [3, 3, 8]

例3:リストの中の辞書を処理

# 学生の点数データ
students = [
    {'name': '田中', 'score': 85},
    {'name': '佐藤', 'score': 92},
    {'name': '鈴木', 'score': 78}
]

# 名前だけを取り出す
names = list(map(lambda student: student['name'], students))
print(names)  # ['田中', '佐藤', '鈴木']

# 点数だけを取り出す
scores = list(map(lambda student: student['score'], students))
print(scores)  # [85, 92, 78]

複数のリストを同時に処理する

map関数は、複数のリストを同時に処理することもできます。

# 2つのリストの要素を足し算
list1 = [1, 2, 3]
list2 = [10, 20, 30]
sums = list(map(lambda x, y: x + y, list1, list2))
print(sums)  # [11, 22, 33]

# 3つのリストの要素を掛け算
list1 = [1, 2, 3]
list2 = [2, 3, 4]
list3 = [3, 4, 5]
products = list(map(lambda x, y, z: x * y * z, list1, list2, list3))
print(products)  # [6, 24, 60]

既存の関数を使う

lambda式を使わなくても、既存の関数を直接使えます。

# str関数を使って数値を文字列に変換
numbers = [1, 2, 3, 4]
str_numbers = list(map(str, numbers))
print(str_numbers)  # ['1', '2', '3', '4']

# abs関数を使って絶対値を取得
numbers = [-1, -2, 3, -4]
abs_numbers = list(map(abs, numbers))
print(abs_numbers)  # [1, 2, 3, 4]

# round関数を使って小数を四捨五入
decimals = [1.2, 2.7, 3.5, 4.1]
rounded = list(map(round, decimals))
print(rounded)  # [1, 3, 4, 4]

for文との比較

同じ処理をfor文とmap関数で比べてみましょう。

for文の場合

# 全ての数字を3倍にする(for文)
numbers = [1, 2, 3, 4, 5]
result = []
for num in numbers:
    result.append(num * 3)
print(result)  # [3, 6, 9, 12, 15]

map関数の場合

# 全ての数字を3倍にする(map関数)
numbers = [1, 2, 3, 4, 5]
result = list(map(lambda x: x * 3, numbers))
print(result)  # [3, 6, 9, 12, 15]

map関数のメリット

  • コードが短くなる
  • 一目で「全ての要素に処理を適用している」と分かる
  • 関数型プログラミングのスタイル

for文のメリット

  • 複雑な処理も書きやすい
  • 条件分岐を含む処理に向いている
  • 初心者には理解しやすい

よくある間違いとその解決方法

間違い1:listで変換するのを忘れる

# 間違い
numbers = [1, 2, 3]
result = map(lambda x: x * 2, numbers)
print(result)  # <map object at 0x...>

# 正しい
result = list(map(lambda x: x * 2, numbers))
print(result)  # [2, 4, 6]

間違い2:mapオブジェクトを再利用しようとする

# 間違い
numbers = [1, 2, 3]
map_obj = map(lambda x: x * 2, numbers)
list1 = list(map_obj)  # [2, 4, 6]
list2 = list(map_obj)  # [] 空になる!

# 正しい
numbers = [1, 2, 3]
result = list(map(lambda x: x * 2, numbers))
list1 = result  # [2, 4, 6]
list2 = result  # [2, 4, 6]

間違い3:引数の数が合わない

# 間違い(lambda式の引数は1つなのに、リストを2つ渡している)
list1 = [1, 2, 3]
list2 = [4, 5, 6]
result = list(map(lambda x: x * 2, list1, list2))  # エラー!

# 正しい(lambda式の引数を2つにする)
result = list(map(lambda x, y: x + y, list1, list2))  # [5, 7, 9]

map関数と他の機能との比較

リスト内包表記との比較

同じ処理をリスト内包表記でも書けます。

numbers = [1, 2, 3, 4, 5]

# map関数
doubled_map = list(map(lambda x: x * 2, numbers))

# リスト内包表記
doubled_list = [x * 2 for x in numbers]

# どちらも結果は同じ
print(doubled_map)   # [2, 4, 6, 8, 10]
print(doubled_list)  # [2, 4, 6, 8, 10]

どちらを使うべき?

  • 単純な変換:map関数の方が短い
  • 条件付きの処理:リスト内包表記の方が分かりやすい
  • チームの方針:プロジェクトで統一する

filter関数との組み合わせ

map(変換)とfilter(絞り込み)を組み合わせることもできます。

numbers = [1, 2, 3, 4, 5, 6]

# 偶数だけを取り出して2倍にする
even_doubled = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers)))
print(even_doubled)  # [4, 8, 12]

# 同じことをリスト内包表記で
even_doubled2 = [x * 2 for x in numbers if x % 2 == 0]
print(even_doubled2)  # [4, 8, 12]

実践的な使用例

例1:CSVデータの処理

# CSVの行データ(文字列)を数値に変換
csv_row = "1,2,3,4,5"
str_numbers = csv_row.split(",")
int_numbers = list(map(int, str_numbers))
print(int_numbers)  # [1, 2, 3, 4, 5]

# 複数行の処理
csv_data = ["1,2,3", "4,5,6", "7,8,9"]
all_numbers = list(map(lambda row: list(map(int, row.split(","))), csv_data))
print(all_numbers)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

例2:Webフォームのデータ処理

# フォームから送信されたデータ(文字列)を整理
form_data = {
    'ages': ['25', '30', '35'],
    'scores': ['85.5', '92.0', '78.5']
}

# 年齢を整数に変換
ages = list(map(int, form_data['ages']))
print(ages)  # [25, 30, 35]

# スコアを浮動小数点数に変換
scores = list(map(float, form_data['scores']))
print(scores)  # [85.5, 92.0, 78.5]

例3:ファイル名の一括変更

# ファイル名のリスト
filenames = ['photo1.jpg', 'photo2.jpg', 'photo3.jpg']

# 全てを大文字に変換
upper_names = list(map(lambda name: name.upper(), filenames))
print(upper_names)  # ['PHOTO1.JPG', 'PHOTO2.JPG', 'PHOTO3.JPG']

# 拡張子を変更
new_names = list(map(lambda name: name.replace('.jpg', '.png'), filenames))
print(new_names)  # ['photo1.png', 'photo2.png', 'photo3.png']

map関数を使うべき場面

使うべき場面

  1. 全ての要素に同じ処理を適用したい
  2. 既存の関数を使いたい(int、str、len など)
  3. 関数型プログラミングのスタイルを好む
  4. コードを短くしたい

使わない方が良い場面

  1. 複雑な条件分岐がある
  2. エラーハンドリングが必要
  3. 処理の途中で変数を使いたい
  4. チームがfor文を好む

まとめ

map関数は、Pythonでリスト処理を効率的に行うための強力なツールです。

重要なポイント

  • map関数は全ての要素に同じ処理を適用する
  • 結果はmapオブジェクトなので、list()で変換が必要
  • lambda式と組み合わせると短いコードが書ける
  • 既存の関数(int、str、len など)も使える
  • 複数のリストを同時に処理できる

基本的な使い方

# 基本形
result = list(map(関数, リスト))

# lambda式を使う場合
result = list(map(lambda x: 処理, リスト))

# 既存の関数を使う場合
result = list(map(int, 文字列リスト))

使い分けの目安

  • 単純な変換:map関数
  • 条件付きの処理:リスト内包表記
  • 複雑な処理:for文

コメント

タイトルとURLをコピーしました