【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が出るまで遅延評価