Python 3.14のmap(strict=True)で長さ違いを検出する方法

二つの入力列をmapで処理し、通常は余った要素が使われず、strict=Trueでは長さ違いをValueErrorとして検出することを示す説明図
目次

答え: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 --version
Python 3.14.8

Python 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
二つのiterableから要素を順に取り出し、対応する間は結果を返し、一方だけ終了した地点で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
ValueError

mを作っただけでは例外は発生しません。また、最初の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で追加されたことが示されています。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次