Pythonの組み込み関数all(), any()の使い方

Pythonでリストやタプルなどのイテラブルオブジェクトの要素がすべてTrue(真)か、いずれか一つでもTrueか、あるいは、すべてFalse(偽)かを判定するには組み込み関数all(), any()を使います。

組み込み関数 - all() — Python 3.7.1rc2 ドキュメント すべての要素がTrueであればTrueを返す 組み込み関数 - any() — Python 3.7.1rc2 ドキュメント いずれかの要素がTrueであればTrueを返すここでは、all()およびany()の使い方として、以下の内容について説明します。

Pythonにおける真偽値 すべての要素がTrueか判定: all() いずれかの要素がTrueか判定: any() すべての要素がFalseか判定: not any() 条件に対して判定: リスト内包表記、ジェネレータ式

Pythonにおける真偽値

Pythonには真偽値bool型のTrueとFalseがあるが、if文などの条件での判定では、数値や文字列などの他の型もTrueかFalseかいずれかに判定されます。

組み込み型 - 真理値判定 — Python 3.7.1rc2 ドキュメント

以下のオブジェクトはFalseと判定されます。

偽であると定義されている定数: None と False 数値型におけるゼロ: 0, 0.0, 0j(複素数), Decimal(0), Fraction(0, 1) 空のシーケンスまたはコレクション: '', (), [], {}, set(), range(0)

その他のオブジェクトはすべてTrueと判定されます。 詳細は

以降で説明するall(), any()においてもこのルールに従って真偽が判定されます。

すべての要素がTrueか判定: all()

all()は引数に指定したイテラブルオブジェクトの要素がすべてTrueと判定されるとTrueを返します。一つでもFalseがあればFalse。

print(all([True, True, True]))
# True

print(all([True, False, True]))
# False

リストに限らず、タプルや集合set型も引数に指定可。

print(all((True, True, True)))
# True

print(all({True, True, True}))
# True

all()は以下のコードと等価。

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

組み込み関数 - all() — Python 3.7.1rc2 ドキュメント

したがって、空のイテラブルオブジェクトにはTrueを返します。

print(all([]))
# True

上述のように、bool型のTrue, Falseだけでなく、その他の型も判定して結果が返されます。

print(all([100, [0, 1, 2], 'abc']))
# True

print(all([100, [0, 1, 2], 'abc', {}]))
# False

いずれかの要素がTrueか判定: any()

any()は引数に指定したイテラブルオブジェクトの要素のいずれかがTrueと判定されるとTrueを返します。すべてFalseであればFalse。

print(any([True, False, False]))
# True

print(any([False, False, False]))
# False

リストに限らず、タプルや集合set型も引数に指定可。

print(any((True, False, False)))
# True

print(any({True, False, False}))
# True

any()は以下のコードと等価。

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

組み込み関数 - any() — Python 3.7.1rc2 ドキュメント

したがって、空のイテラブルオブジェクトにはFalseを返します。

print(any([]))
# False

上述のように、bool型のTrue, Falseだけでなく、その他の型も判定して結果が返されます。

print(any([False, None, 0, 0.0, 0 + 0j, '', [], {}, ()]))
# False

print(any([False, None, 0, 0.0, 0 + 0j, '', [], {}, (), 1]))
# True

すべての要素がFalseか判定: not any()

any()はひとつでもTrueがあるとTrueを返し、すべての要素がFalseのときのみFalseを返します。 したがって、notでany()の否定をとることで、すべての要素がFalseのときのみTrueとすることができます。

print(not any([False, False, False]))
# True

print(not any([True, False, False]))
# False

条件に対して判定: リスト内包表記、ジェネレータ式

これまでの例はイテラブルオブジェクトの要素をそのままTrueかFalseか判定していたが、内包表記を使うと、任意の条件に対してall()やany()を適用できます。 すべての要素が条件を満たすかどうかなどの判定ができます。 あるイテラブルオブジェクトの各要素に対する条件判定の結果は、リスト内包表記を使って以下のように取得できます。

l = [0, 1, 2, 3, 4]

print([i > 2 for i in l])
# [False, False, False, True, True]

リスト内包表記の詳細は

この結果をall(), any()の引数に指定すると、各要素がすべて条件を満たすか、ひとつでも条件を満たすかといった判定ができます。

print(all([i > 2 for i in l]))
# False

print(any([i > 2 for i in l]))
# True

ここで、リスト内包表記の[]を()に変えるとジェネレータ式となり、リストではなくジェネレータを返します。

print(type([i > 2 for i in l]))
# <class 'list'>

print(type((i > 2 for i in l)))
# <class 'generator'>

ジェネレータ式を唯一の引数として関数を呼び出す場合、()を省略できます。

print(type(i > 2 for i in l))
# <class 'generator'>

これをall(), any()の引数に指定できます。

print(all(i > 2 for i in l))
# False

print(any(i > 2 for i in l))
# True

ジェネレータはリストと異なり逐次処理されるので、メモリ使用量を抑えられるというメリットがあります。 また、Trueは1、Falseは0として処理されるので、sum()を使うとTrueの数、すなわち、条件を満たす要素の数を取得できます。

print(sum(i > 2 for i in l))
# 2

Falseの数をカウントしたい場合はnotを使えば問題ありません。

print(sum(not (i > 2) for i in l))
# 3
Last Updated: 6/26/2019, 10:34:03 PM