[解決!Python]all/any関数を使って、リストなどの要素が全て真か/偽か、真な要素があるか/偽な要素があるかを調べるには:解決!Python
Pythonに組み込みのall関数とany関数を使うと反復可能オブジェクトの要素が全て真であるか、および、そこに真な要素があるかを調べられる。not演算子と組み合わせることで全要素が偽であるか、偽な要素があるかどうかを調べられる。
all_true = [True, True, True]
all_false = [False, False, False]
mixed = [True, False, True]
# 全要素が真かどうかを調べる
result = all(all_true) # 全要素が真なのでTrue
print(result) # True
result = all(all_false) # 全要素が偽なのでFalse
print(result) # False
result = all(mixed) # 偽な要素があるのでFalse
print(result) # False
# 真な要素があるかどうかを調べる
result = any(all_true) # 全要素が真なのでTrue
print(result) # True
result = any(all_false) # 真な要素がないのでFalse
print(result) # False
result = any(mixed) # 真な要素があるのでTrue
print(result) # True
# 全要素が偽かどうかを調べる
result = not any(all_true) # 全てが真なのでany関数の戻り値はTrue。それを反転
print(result) # False
result = not any(all_false) # 全てが偽なのでany関数の戻り値はFalse。それを反転
print(result) # True
result = not any(mixed) # 真な要素があるのでany関数の戻り値はTrue。それを反転
print(result) # False
# 偽な要素があるかどうか調べる
result = not all(all_true) # 全てが真なのでall関数の戻り値はTrue。それを反転
print(result) # False
result = not all(all_false) # 全てが偽なのでall関数の戻り値はFalse。それを反転
print(result) # True
result = not all(mixed) # 偽な要素があるのでall関数の戻り値はFalse。それを反転
print(result) # True
操作 | 関数 |
---|---|
全要素が真かどうか | all(L) |
真な要素があるかどうか | any(L) |
全要素が偽かどうか | not any(L) |
偽な要素があるかどうか | not all(L) |
all関数とany関数による要素の真偽判定(Lはリストなどの反復可能オブジェクトとする) |
all関数とany関数
Pythonのall関数とany関数とは次のようなものだ。
これらを使うと以下のことを調べられる。
- 反復可能オブジェクトの全要素が真かどうか
- 反復可能オブジェクトに真な要素があるかどうか
- 反復可能オブジェクトの全要素が偽かどうか
- 反復可能オブジェクトに偽な要素があるかどうか
Pythonのドキュメントによれば「False、None、すべての型における数値の0、空の文字列、空のコンテナ」は「偽」と見なされ、それ以外の値は真と見なされることは覚えておこう。例えば、文字列「'False'」や整数値「42」、リスト「[False, False, False]」は真と見なされる。
なお、この後は以下の3つのリストを例に上記の調べ方を紹介する。
all_true = [True, True, True]
all_false = [False, False, False]
mixed = [True, False, True]
全要素が真かどうかを調べる
反復可能オブジェクトの全要素が真かどうかを調べるにはall関数を使えばよい。以下に例を示す。
result = all(all_true) # 全要素が真なのでTrue
print(result) # True
result = all(all_false) # 全要素が偽なのでFalse
print(result) # False
result = all(mixed) # 偽な要素があるのでFalse
print(result) # False
最初の例ではリストall_trueの全要素が真かどうかを調べている。all_trueは[True, True, True]なのでall関数の戻り値はTrueとなる。
次の例ではリストall_falseの全要素が偽かどうかを調べている。all_falseは[False, False, False]なのでall関数はFalseを返す。
最後の例ではリストmixedを対象としている。mixedは[True, False, True]なのでall関数の戻り値はFalseとなる。
真な要素があるかどうかを調べる
反復可能オブジェクトに真となる要素が含まれているかどうかはany関数で調べられる。以下に例を示す。
result = any(all_true) # 全要素が真なのでTrue
print(result) # True
result = any(all_false) # 真な要素がないのでFalse
print(result) # False
result = any(mixed) # 真な要素があるのでTrue
print(result) # True
リストall_trueは全ての要素が真なのでもちろん、any関数はTrueを返す。リストall_falseは全ての要素が偽なので戻り値はFalseになる。リストmixedはTrueとFalseが混在しているので、真な要素があるかどうかを調べるany関数はTrueを返す。
全要素が偽かどうかを調べる
「反復可能オブジェクトの全要素が偽かどうか」を調べるというのは、「反復可能オブジェクトに真な要素が1つもないかどうか」を調べるということでもある。反復可能オブジェクトに真な要素が(1つでも)あれば、「全要素が偽かどうか」という条件は成立しないからだ。
そして「反復可能オブジェクトに真な要素が(1つでも)あるか」は上述のany関数で調べられる。これがTrueを返すときには真な要素が1つ以上あるということであり、「全要素が偽かどうか」は成立しない。これがFalseを返すときには、真な要素が1つもないということであり、「全要素が偽かどうか」が成立する。従って、any関数の戻り値をnot演算子で反転すれば望みの結果が得られる。
以下に例を示す。
result = not any(all_true) # 全てが真なのでany関数の戻り値はTrue。それを反転
print(result) # False
result = not any(all_false) # 全てが偽なのでany関数の戻り値はFalse。それを反転
print(result) # True
result = not any(mixed) # 真な要素があるのでany関数の戻り値はTrue。それを反転
print(result) # False
最初の例では、リストall_trueは[True, True, True]であり、全要素が偽かどうかは成立していない。all_trueを渡すとany関数はTrueを返すので、それをnot演算子で反転することで全体としての結果はFalse(全要素が偽かどうかは成立しない)となる。
次の例では、リストall_falseは[False, False, False]であり、全要素が偽かどうかは成立している。all_falseを渡すとany関数はFalseを返すので(真な要素がないので)、それをnot演算子で反転することで全体としての結果はTrue(全要素が偽かどうかは成立する)となる。
最後の例では、リストmixedは[True, False, True]であり、全要素が偽かどうかは成立していない。mixedを渡すとany関数はTrueを返すので(真な要素があるので)、それをnot演算子で反転することで全体としての結果はFalse(全要素が偽かどうかは成立しない)となる。
こうした処理は既にイディオムとなっている人もいるかもしれないが、コードの意味を取りにくいのであれば、以下のような関数を定義してしまうのもよいだろう。
def is_all_false(x):
return not any(x)
偽な要素があるかどうかを調べる
「反復可能オブジェクトに偽な要素があるかどうか」を調べるというのは、「反復可能オブジェクトの全要素が真かどうか」の結果を反転させたものと考えられる。反復可能オブジェクトに1つでも偽な要素があれば、「反復可能オブジェクトの全要素が真かどうか」は成立しないからだ。
そして、「反復可能オブジェクトの全要素が真かどうか」は(既にお分かりの通り)all関数で調べられる。これがTrueを返すときには全要素が真であるということであり、「偽な要素があるかどうか」は成立しない。Falseを返すときには、偽な要素が1つ以上あるということであり、「偽な要素があるかどうか」が成立する。よって、all関数の戻り値をnot演算子で反転することで、「偽な要素があるかどうか」を調べられる。
以下に例を示す。
result = not all(all_true) # 全てが真なのでall関数の戻り値はTrue。それを反転
print(result) # False
result = not all(all_false) # 全てが偽なのでall関数の戻り値はFalse。それを反転
print(result) # True
result = not all(mixed) # 偽な要素があるのでall関数の戻り値はFalse。それを反転
最初の例では、リストall_trueは[True, True, True]であり、偽な要素があるかどうかは成立していない。all_trueを渡すとall関数の戻り値はTrueとなるので、それをnot演算子で反転することで全体としての結果はFalse(偽な要素があるかどうかは成立しない)となる。
次の例では、リストall_falseは[False, False, False]であり、偽な要素があるかどうかは成立している。all_falseを渡すとall関数の戻り値はFalseとなるので、それをnot演算子で反転することで全体としての結果はTrue(偽な要素があるかどうかは成立する)となる。
最後の例ではリストmixedは[True, False, True]であり、偽な要素があるかどうかは成立している。mixedを渡すとall関数はFalseを返すので、それをnot演算子で反転することで全体としての結果はTrue(偽な要素があるかどうかは成立する)となる。
先ほどの「全要素が偽かどうか」と同様に、「not all(……)」の意味を読み取りにくいようであれば、以下のような関数を定義してしまうのもよいだろう。
def is_any_false(x):
return not all(x)
Copyright© Digital Advantage Corp. All Rights Reserved.