【Python】anyとallについて

【Python】anyとallについて

目次

anyとallの概要

Pythonの組み込み関数 any()all() は、リストやタプルなどのイテラブル(繰り返し可能なオブジェクト)に対して真偽値の判定を行う関数です。

  • any(iterable): イテラブルの要素のうち、少なくとも1つが真ならば True を返す。
  • all(iterable): イテラブルの全要素が真ならば True を返す。

anyの使い方と例

any() は、イテラブル内に1つでも真の要素があれば True を返します。

基本的な例


print(any([False, False, True]))  # True(1つでも True があるため)
print(any([0, 0, 0]))             # False(すべて False 相当)
print(any([]))                    # False(空のリスト)

文字列リストでの使用


words = ["", "", "hello"]
print(any(words))  # True("hello" が非空文字列なので真)

条件を満たす要素があるかの判定


numbers = [1, 3, 5, 8]
print(any(n % 2 == 0 for n in numbers))  # True(8が偶数)

allの使い方と例

all() は、イテラブル内のすべての要素が真である場合にのみ True を返します。

基本的な例


print(all([True, True, True]))  # True(すべて True)
print(all([True, False, True])) # False(False が含まれる)
print(all([]))                  # True(空のリストは全て満たしているとみなされる)

数値リストでの使用


numbers = [2, 4, 6, 8]
print(all(n % 2 == 0 for n in numbers))  # True(全て偶数)

anyとallの組み合わせ

any()all() を組み合わせることで、より複雑な条件を判定できます。

例1: すべてのリストに1つ以上の真の値があるか確認


lists = [[0, 1], [0, 2], [0, 0]]
print(all(any(lst) for lst in lists))  # False(最後のリストがすべて0)

例2: どのリストも全て真の要素で構成されているか


lists = [[1, 2], [3, 4], [5, 6]]
print(any(all(lst) for lst in lists))  # True(すべてのリストが全て真)

実用的な使用例

1. ユーザー入力のバリデーション


inputs = ["username", "password", ""]
if all(inputs):
    print("すべてのフィールドが入力されています")
else:
    print("未入力のフィールドがあります")  # 空文字があるためこのメッセージ

2. データの検証


data = [10, 15, 20, -5]
if any(n < 0 for n in data):
    print("データに負の値が含まれています")  # -5 があるため True

3. 許可リストのチェック


allowed_roles = {"admin", "editor"}
user_roles = {"viewer", "editor"}

if any(role in allowed_roles for role in user_roles):
    print("アクセス許可あり")  # "editor" が許可リストに含まれる
else:
    print("アクセス権なし")

パフォーマンスと注意点

any()all() は短絡評価(ショートサーキット評価)を行います。

短絡評価の例


def check(x):
    print(f"check({x})")
    return x > 0

print(any(check(n) for n in [-1, 0, 3, 4]))  # 3 が評価された時点で処理が終了

空のイテラブルに注意

any([])False を返し、all([])True を返します。 特にデータ処理時には、空リストの扱いに注意が必要です。

リストとジェネレーターの違い

any()all() でリストを使う場合、全要素がメモリに展開されます。 一方、ジェネレーターを使うと、必要な要素のみ評価されるためメモリ使用量を抑えられます。


import time

def slow_numbers():
    for i in range(5):
        time.sleep(1)  # 1秒待つ
        yield i

print(any(slow_numbers()))  # 0が False なので、1が出るまで遅延評価

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です