答え:Python 3.14ではmapにstrict=Trueを付ける
複数の入力を組み込みのmapで同時に処理し、どれか一つだけ要素数が違う場合に処理を止めたいなら、Python 3.14で追加されたstrict=Trueを指定します。通常のmapは最短のiterableが終わった時点で終了するため、長い側に残った要素は結果に現れません。strict=Trueなら、一方だけが先に終わった時点でValueErrorになります。
result = list(
map(
lambda a, b: a + b,
[1, 2, 3],
[10, 20],
strict=True,
)
)この例では二つの入力の長さが違うため、最後まで消費するとValueErrorが発生します。データの欠落を黙って受け入れたくない処理で役立ちます。
最初にPythonの版を確認する
strict引数はPython 3.14で追加されました。まず実行環境の版を確認します。
python --versionPython 3.14.8Python 3.13.7で同じようにstrict=Trueを渡すと、未対応のキーワード引数としてTypeErrorになります。3.13以前も対象にするなら、版を分けるか別の長さ確認が必要です。
通常のmapとstrict=Trueの違い
次の結果例は、挙動を説明するための合成データをPython 3.14.8で確認したものです。
| 条件 | 結果 |
|---|---|
| 通常のmapで長さが違う | 最短の入力に合わせて終了する |
| strict=Trueで等長 | 通常どおり全要素を処理する |
| strict=Trueで一方が短い | 不一致地点でValueError |
| Python 3.13.7でstrict=True | キーワード引数が未対応のためTypeError |
通常のmapは長い側の残りを使わない
result = list(
map(
lambda a, b: a + b,
[1, 2, 3],
[10, 20],
)
)
print(result)[11, 22]3に対応する二つ目の値がないため、処理はそこで終了します。長い側の残りが不要なら問題ありませんが、入力漏れを見つけたい場面では見落としにつながります。
strict=Trueで等長なら最後まで処理できる
result = list(
map(
lambda a, b: a + b,
[1, 2],
[10, 20],
strict=True,
)
)
print(result)[11, 22]どちら側が長くても不一致を検出する
一方だけ先に終了する組み合わせなら、どちらが短くてもValueErrorになります。
cases = [
([1, 2, 3], [10, 20]),
([1, 2], [10, 20, 30]),
]
for left, right in cases:
try:
print(list(map(lambda a, b: a + b, left, right, strict=True)))
except ValueError as exc:
print(type(exc).__name__)ValueError
ValueError
注意:mapは遅延実行なので作成時には検査しない
mapが返すのはリストではなくイテレーターです。作成した瞬間に全入力の長さを事前検査するわけではありません。不一致は、実際に要素を取り出して、その地点まで処理が進んだときに分かります。
m = map(
lambda a, b: a + b,
[1, 2, 3],
[10, 20],
strict=True,
)
print(next(m))
print(next(m))
try:
print(next(m))
except ValueError as exc:
print(type(exc).__name__)11
22
ValueErrormを作っただけでは例外は発生しません。また、最初の1件だけ取り出して処理をやめた場合、その先にある長さ違いまで必ず検出されるとは限りません。入力全体を確認したいなら、list(...)やループで末尾まで消費します。
ValueErrorが出たときの対処
長さ違いが業務上の異常なら、例外を握りつぶして処理を続けるのではなく、上流データを修正します。たとえばID列と金額列なら、欠けた行、余分な行、抽出条件の違いを確認します。
- 入力元ごとの件数を記録し、どこで差が生じたか確認する
- 同じ抽出条件、同じ期間、同じ並び順でデータを作り直す
例外を何もせず無視すると、strict=Trueを付けた目的まで失われます。利用者向け表示へ変換する場合も、不一致が分かる情報は残します。
別のエラーと混同しない
strict=Trueが検出するのは、複数iterableの終了時点の不一致です。関数が受け取る引数の数が合わない場合や、関数内部の型変換に失敗した場合は別の問題です。
# 関数側の引数数が合わない例
list(map(lambda a: a, [1, 2], [10, 20], strict=True))# 関数内部の変換に失敗する例
list(map(int, ["1", "x"]))前者は呼び出す関数の引数設計、後者は入力値と変換処理を見直します。長さが等しくても、これらのエラーは起こります。
よくある質問
strict=Trueは処理を速くしますか
この記事では性能比較を行っておらず、速度向上は主張しません。目的は、複数入力の長さ違いを黙って切り捨てず、例外として気づけるようにすることです。
作成したmapを一度も使わなくても不一致が分かりますか
分かりません。mapは遅延実行です。イテレーターを不一致地点まで消費したときに検出されます。
Python 3.13以前でも同じ書き方を使えますか
使えません。Python 3.13.7ではstrictキーワードに対してTypeErrorになります。対応版を分けるか、別途検査してください。
公式資料
仕様はPython 3.14公式ドキュメントの組み込み関数mapで確認できます。通常は最短のiterableが終了したときに止まり、strict=Trueでは一方が先に終了するとValueErrorになること、そしてstrictが3.14で追加されたことが示されています。


コメント