はじめに
開発中にPythonで「リストの要素がすべて空文字列か」という判定をしたい場面があり、なにかないかと調べてみたら、allという組み込み関数で簡単に実装できました。 今回はそのall、対になるanyを紹介します。
all
リストやタプルのような、iterableオブジェクトの要素がすべて真のときにTrueを返す関数。 Pythonでの真は、数値は0以外、文字列は空文字列(“”)以外、 タプルは空のタプル()以外、リストは空のリスト[]以外、ディクショナリは空のディクショナリ{}以外など。 公式ドキュメントにも、書いてありますが、以下のコードと同じ。
def all(iterable):
for element in iterable:
if not element:
return False
return True
例
>>> a = [True, True, True]
>>> all(a)
True
>>> b = [True, True, False]
>>> all(b)
False
any
iterableオブジェクトの要素が一つでも真のときにTrueを返す関数。 同じく公式ドキュメントにも、書いてありますが、以下のコードと同じ。
def any(iterable):
for element in iterable:
if element:
return True
return False
例
>>> a = [False, False, False]
>>> any(a)
False
>>> b = [True, False, False]
>>> any(b)
True
どんな風に使ったか
「リストの要素がすべて空文字列か」の判定するために、リスト内包表記と合わせて使いました。
l = ['', '', ''] # すべて空文字列の要素
# リストの要素がすべて空文字列かの判定
all([x == '' for x in l]) # => True
リスト内包表記部分は、各値の空文字列との比較結果を返しているので、
[x == '' for x in l] => [True, True, True]となっています。
これを使えば、「リストの要素がすべて正の数か」の判定が以下のように書けたり
all((x >= 0 for x in [1, 2, 3])) # => True
all((x >= 0 for x in [1, 2, -3])) # => False
anyを使って、「リストの要素が一つでも正の数か」の判定が以下のように書けます。
any((x >= 0 for x in [1, -2, -3])) # => True
any((x >= 0 for x in [-1, -2, -3])) # => False
まとめ
all関数が論理積で、any関数が論理和という感じです。 うまく関数を使うとすっきり書けたりしますね。 ちなみにRubyやC#にも同じようなのがあります。
海津 純平