Python | データ構造:all

Python
スポンサーリンク

概要(all は「すべてが真なら True」を返す基本関数)

all は、リスト・タプル・集合・辞書・ジェネレータなどのイテラブルの中の「全ての要素が True と評価されるか」を判定する組み込み関数です。全てが真なら True、ひとつでも偽があれば False。空のイテラブルは True(反例が無いので“すべて満たす”とみなされる)になります。

print(all([1, 2, 3]))         # True(非ゼロは真)
print(all([True, False]))     # False
print(all([]))                # True(空はTrue)
Python

基本動作と評価ルール(ここが重要)

真偽値への評価と短絡(ショートサーキット)

all は各要素を bool(…) で真偽値に評価し、False が見つかった時点で処理を止めます(短絡評価)。0、空文字、空リスト、空辞書、None、False は「偽」、それ以外は「真」とみなされます。

values = [1, "", "ok"]
print(all(values))  # False(""が偽、そこで止まる)
Python

空は True の理由と使い方

空は「反例がない」ため True になります。「要件を満たすデータが無かったので違反もなかった」と読むことができます。空の扱いが要件上 “False” であってほしい場合は、事前に非空チェックを加えましょう。

nums = []
valid = bool(nums) and all(n > 0 for n in nums)  # まず非空を確認
print(valid)  # False(非空でないため)
Python

条件判定の定番パターン(内包表記・ジェネレータ)

全要素が条件を満たすかを簡潔に書く

要素に対する条件式と組み合わせるのが最もよく使う形です。ジェネレータ式ならメモリ効率も良く、短絡評価で速いです。

nums = [2, 4, 8]
print(all(n % 2 == 0 for n in nums))  # True(全部偶数)
Python

文字列・入力のバリデーション

「必須フィールドが全部非空か」「全部フォーマットを満たすか」などに直感的です。

user = {"name": "taro", "email": "taro@example.com"}
print(all(user.get(k) for k in ("name", "email")))  # True(両方非空)

emails = ["a@x", "b@x", "c@x"]
print(all("@" in e for e in emails))                # True(全て '@' を含む)
Python

実務での使いどころ(安全な検証と効率設計)

数値範囲・型の一括チェック

「全てが正の数」「全てが指定型」など、複数条件を組み合わせても読みやすいです。

values = [10, 20, 5]
print(all(v > 0 for v in values))                 # True
print(all(isinstance(v, int) for v in values))    # True
Python

ネストした構造の一括検査

入れ子のデータでも、欲しい部分を取り出して条件判定を並べれば OK。

store = [
    {"name": "coffee", "price": 350},
    {"name": "tea",    "price": 280},
]
all_under_500 = all(item["price"] < 500 for item in store)
print(all_under_500)  # True
Python

短絡評価でコスト削減

重い検査の前に軽い検査を置くと、最初の偽で止まるため全体コストを抑えられます。

def heavy(x):  # 重い処理の例
    return x % 7 == 0

checks = [
    lambda x: x > 0,         # 軽い
    lambda x: x % 2 == 0,    # 軽い
    lambda x: heavy(x),      # 重い
]
x = -4
print(all(f(x) for f in checks))  # False(1つ目で止まる)
Python

重要ポイントの深掘り(any との違い・落とし穴回避)

any と対になる関係

  • any: ひとつでも真なら True(空は False)
  • all: すべてが真なら True(空は True)

「少なくとも一つ」なら any、「全部」なら all と覚えると迷いません。

vals = [True, False]
print(any(vals))  # True
print(all(vals))  # False
Python

「非空=真」による誤判定を防ぐ

文字列・リスト・辞書は非空なら True。中身の妥当性を見たいのに「非空だけで真」になると誤判定になります。条件式で中身を明示しましょう。

rows = ["ok", ""]
print(all(rows))                              # False("" が偽)
print(all(len(r) >= 2 for r in rows))         # False(長さ基準で検査)
Python

空の扱いを要件に合わせる

空で True になる仕様が不都合なら、非空チェックを組み合わせます。

items = []
safe = bool(items) and all(items)
print(safe)  # False(非空でないため)
Python

例題で身につける(定番から一歩先まで)

例題1:全て非負か

nums = [0, 2, 5]
print(all(n >= 0 for n in nums))  # True
Python

例題2:全て小文字か

words = ["coffee", "tea", "latte"]
print(all(w.islower() for w in words))  # True
Python

例題3:必須キーが全て存在・非空か

user = {"name": "Hanako", "email": "h@example.com"}
required = ("name", "email")
print(all(user.get(k) for k in required))  # True
Python

例題4:全店で在庫ありか(ネスト)

shops = [
    {"name": "A", "stock": {"tea": 1}},
    {"name": "B", "stock": {"tea": 2}},
]
print(all(s["stock"].get("tea", 0) > 0 for s in shops))  # True
Python

まとめ

all は「すべてが真なら True」を返す短絡評価の関数で、空は True。ジェネレータ式と組み合わせると、範囲・型・フォーマット・ネスト構造の検証を一行で、安全かつ効率的に書けます。非空=真の挙動を正しく理解し、要件に応じて非空チェックを前置することで、初心者でも誤判定なく読みやすいバリデーションが実装できます。

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