Pythonのlambdaで条件分岐は書けるのか?
Pythonのlambda式は、1行で関数を定義できる構文です。
ただし、通常のif文のように複数行の処理を書くことはできません。
「lambdaの中で条件によって返す値を変えたい」「then相当の処理をlambdaで書けるか」といった疑問を持った場合、三項演算子(条件式) を使うのが基本的なアプローチになります。
この記事では、lambda式の中で条件分岐を書く方法と、複数条件のパターン、よくあるミスを解説します。
if文の基礎や条件分岐の書き方については、「Pythonのif true 使い方完全ガイド」で詳しく解説しています。
lambda式と三項演算子(基本の形)
Pythonのlambda式の中で条件分岐を実現するには、三項演算子(条件式)を使います。
三項演算子の書き方は次のとおりです。
値A if 条件 else 値B
条件が真のとき値Aが返り、偽のとき値Bが返ります。これが、他の言語でいう「then」に相当する役割を担います。
基本例:数値が正かどうかを判定する
check_positive = lambda x: "正" if x > 0 else "ゼロ以下"
print(check_positive(5))
print(check_positive(-3))
正
ゼロ以下
lambda x: の後ろに三項演算子を置くだけで、条件によって返す値を切り替えられます。
pandasのapply・mapとの組み合わせ
lambda式は、pandasのapplyやmapと組み合わせて使うことが多いパターンです。
列の値に応じてラベルを付ける
import pandas as pd
df = pd.DataFrame({"score": [80, 45, 65, 90]})
df["grade"] = df["score"].apply(lambda x: "合格" if x >= 60 else "不合格")
print(df)
score grade
0 80 合格
1 45 不合格
2 65 合格
3 90 合格
条件ごとにラベルを付けたい場面では、この書き方が実用的です。
複数条件を書く方法
三項演算子は入れ子にすることで、複数の条件分岐を表現できます。ただし、入れ子が深くなると読みにくくなるため注意が必要です。
三項演算子の入れ子(2段階の分岐)
classify = lambda x: "高" if x >= 80 else ("中" if x >= 50 else "低")
print(classify(90))
print(classify(65))
print(classify(30))
高
中
低
elseの後ろにさらに三項演算子を続けることで、3値以上の分岐を1行で書けます。
andとorを使った複数条件
複数の条件を同時に評価したい場合は、and・orを使えます。
check = lambda x, y: "両方正" if x > 0 and y > 0 else "どちらかが0以下"
print(check(3, 5))
print(check(3, -1))
両方正
どちらかが0以下
AWS Lambdaでlambda式を使う場面
「AWSのLambda(サーバーレス関数)でもPythonのlambda式を使う場面があります。
AWS Lambdaの関数定義自体はPythonのdefを使うのが基本ですが、Pythonコードの内部でlambda式を使うことはもちろん可能です。
例として、取得したデータを加工する際にlambda式と条件分岐を組み合わせるパターンを示します。
def lambda_handler(event, context):
records = [
{"name": "Alice", "score": 85},
{"name": "Bob", "score": 40},
{"name": "Carol", "score": 70},
]
# lambda式でスコアに応じてラベルを付ける
label = lambda score: "pass" if score >= 60 else "fail"
result = [
{"name": r["name"], "result": label(r["score"])}
for r in records
]
return result
[
{"name": "Alice", "result": "pass"},
{"name": "Bob", "result": "fail"},
{"name": "Carol", "result": "pass"}
]
AWS Lambdaのハンドラ関数(lambda_handler)と、Pythonのlambda式は名前が似ていますが、別の概念です。混同しないよう注意してください。
sortとの組み合わせ(key引数でよく使うパターン)
lambda式が条件分岐と一緒に使われるもう一つの場面が、sorted()やsort()のkey引数です。
data = ["banana", "apple", "cherry", "fig"]
# 文字列の長さで昇順ソート
sorted_data = sorted(data, key=lambda x: len(x))
print(sorted_data)
['fig', 'apple', 'banana', 'cherry']
条件によってソートキーを変えたい場合は、三項演算子を組み合わせます。
# 先頭が"b"のものを先に並べる(それ以外は後ろ)
sorted_data = sorted(data, key=lambda x: (0 if x.startswith("b") else 1, x))
print(sorted_data)
['banana', 'apple', 'cherry', 'fig']
よくあるミスと注意点
if文をlambda内にそのまま書こうとしてしまう
lambda式の中に通常のif文を書くことはできません。
# これはエラーになる
bad_lambda = lambda x: if x > 0: return "正" else: return "負"
SyntaxError: invalid syntax
条件分岐が必要なら、三項演算子を使うか、def文で通常の関数として定義してください。
入れ子が深すぎて読みにくくなる
# 読みにくい例(入れ子が深い)
classify = lambda x: "A" if x >= 90 else ("B" if x >= 80 else ("C" if x >= 70 else ("D" if x >= 60 else "F")))
このような場合は、def文で書き直した方が保守しやすくなります。
def classify(x):
if x >= 90:
return "A"
elif x >= 80:
return "B"
elif x >= 70:
return "C"
elif x >= 60:
return "D"
else:
return "F"
1行で収まる条件分岐はlambda式、3段階以上の分岐はdef文、という使い分けが読みやすさにつながります。
Noneが返ってくるケースへの対応
lambdaで外部データを加工するとき、値がNoneになる可能性がある場合はNoneチェックを入れましょう。
safe_upper = lambda x: x.upper() if x is not None else ""
print(safe_upper("hello"))
print(safe_upper(None))
HELLO
Noneチェックを省略すると、AttributeErrorが発生することがあります。
AI時代での補足
AIにlambda式を含むコードを生成させる機会は増えています。ただし、可読性を下げる入れ子構造のlambda式が出力されることもあります。「動くか」だけでなく「この条件分岐は適切か」を判断できると、AIの出力を正しく評価しやすくなります。
まとめ
- Pythonのlambda式で条件分岐するには三項演算子(
値A if 条件 else 値B)を使う - 複数条件は三項演算子の入れ子や
and/orで表現できる - 分岐が3段階以上になる場合は、
def文に書き直す方が読みやすい - pandasの
apply・mapやsortのkey引数との組み合わせが実務でよく出る場面 - Noneが返りうる値を扱う場合は、Noneチェックを入れることで予期しないエラーを防げる
lambda式の条件分岐をどこで使うか判断する力は、AIが出したコードを読み解く場面でも役立ちます。
Pythonの基礎的な条件分岐(if文)の理解を深めたい場合は、「Pythonのif true 使い方完全ガイド」もあわせて確認してください。