lambda式は、名前を付けずに小さな関数を定義する構文です。1行で簡単な処理を行う関数が必要なとき、defで関数を定義するよりも簡潔に書けます。sorted()やmap()、filter()と組み合わせて使うことが多いです。
この記事では、lambda式の基本構文から、実践的な使い方、使うべき場面と避けるべき場面まで詳しく解説します。
基本的な使い方
lambda式の構文は lambda 引数: 式 です。
Python
# 通常の関数
def add(a, b):
return a + b
# lambda式で同じ処理
add_lambda = lambda a, b: a + b
print(add(3, 5))
print(add_lambda(3, 5))
# 1引数のlambda
double = lambda x: x * 2
print(double(10))
# 引数なしのlambda
greet = lambda: "こんにちは!"
print(greet())
実行結果
8
8
20
こんにちは!
sorted()との組み合わせ
lambda式が最もよく使われるのは、sorted()のkey引数です。
Python
# 文字列の長さでソート
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words)
# 辞書のリストをソート
users = [
{"name": "太郎", "age": 25},
{"name": "花子", "age": 30},
{"name": "次郎", "age": 20},
]
# 年齢でソート
by_age = sorted(users, key=lambda u: u["age"])
for user in by_age:
print(f" {user['name']}: {user['age']}歳")
# タプルの2番目の要素でソート
data = [(1, "c"), (3, "a"), (2, "b")]
print(sorted(data, key=lambda x: x[1]))
実行結果
['date', 'apple', 'banana', 'cherry']
次郎: 20歳
太郎: 25歳
花子: 30歳
[(3, 'a'), (2, 'b'), (1, 'c')]
map()とfilter()
map()はすべての要素に関数を適用し、filter()は条件を満たす要素を抽出します。
Python
# map(): 各要素に関数を適用
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(f"二乗: {squared}")
# filter(): 条件を満たす要素を抽出
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(f"偶数: {evens}")
# 文字列リストの変換
names = ["taro", "hanako", "jiro"]
capitalized = list(map(lambda s: s.capitalize(), names))
print(capitalized)
実行結果
二乗: [1, 4, 9, 16, 25]
偶数: [2, 4]
['Taro', 'Hanako', 'Jiro']
map/filterよりリスト内包表記
多くの場合、map()やfilter()はリスト内包表記で書き換えられます。例えば list(map(lambda x: x**2, nums)) は [x**2 for x in nums] と同じです。Pythonではリスト内包表記の方が好まれる傾向にあります。
max()・min()との組み合わせ
Python
products = [
{"name": "りんご", "price": 200},
{"name": "バナナ", "price": 100},
{"name": "ぶどう", "price": 500},
{"name": "みかん", "price": 150},
]
# 最も高い商品
most_expensive = max(products, key=lambda p: p["price"])
print(f"最高値: {most_expensive['name']} ({most_expensive['price']}円)")
# 最も安い商品
cheapest = min(products, key=lambda p: p["price"])
print(f"最安値: {cheapest['name']} ({cheapest['price']}円)")
実行結果
最高値: ぶどう (500円)
最安値: バナナ (100円)
実践的な使い方
Python
# データ処理パイプライン
raw_data = [" Tokyo ", " osaka", "NAGOYA ", "fukuoka "]
# lambda + mapで一括処理
cleaned = list(map(lambda s: s.strip().title(), raw_data))
print(cleaned)
# 複数条件でのソート
students = [
("太郎", "A", 85),
("花子", "B", 92),
("次郎", "A", 78),
("美咲", "B", 88),
]
# クラス昇順、点数降順でソート
sorted_students = sorted(students, key=lambda s: (s[1], -s[2]))
for name, cls, score in sorted_students:
print(f" {cls}組 {name}: {score}点")
実行結果
['Tokyo', 'Osaka', 'Nagoya', 'Fukuoka']
A組 太郎: 85点
A組 次郎: 78点
B組 花子: 92点
B組 美咲: 88点
lambda式の使いすぎに注意
lambda式は1行の簡単な処理にのみ使いましょう。複雑な処理や複数行の処理が必要な場合は、defで通常の関数を定義する方が可読性が高くなります。PEP 8(Pythonのスタイルガイド)でも、lambda式を変数に代入するよりdefで定義することが推奨されています。
まとめ
lambda 引数: 式で無名関数を作成できるsorted()のkey引数との組み合わせが最も一般的map(),filter(),max(),min()とも相性が良い- 複雑な処理には
defを使い、lambda式は簡単な処理に限定する - リスト内包表記で代替できる場合はそちらを優先する