LoginSignup
0
2

More than 3 years have passed since last update.

【Python】all と any を使いこなそう

Last updated at Posted at 2020-06-20

はじめに

atcoderのチュートリアル問題的なやつでリストの各要素を偶数か奇数か判定しなければならないものがあったので、簡単に書けないかと思ってたらふつーに組み込み関数ありました。そのぐらい書けよって話かもしれませんが、せっかく用意されてるんだから使わせてください。

all(iterable)

iterable の全ての要素が真ならば (もしくは iterable が空ならば) True を返します。

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

※公式ドキュメントより

ここでitarableとはなんなのか説明します。

iterableとは?

反復可能なオブジェクト。要素を一回に一個返すオブジェクト。
   
  ex)リスト、タプル、辞書 ・・・

iter()の引数にこいつを渡すとオブジェクトに対するiteratorを返します。
(iteratorとはデータの流れを表現するオブジェクトです(ざっくり))

例えば

for i in A:

ここでのAがitarableです。 for ではiter()が自動的に呼び出され、一時的な無名の変数を作成してループを回している間iteratorを保持します。

ということでallを試しましょう!

以下はallを使った配列arrayの要素がすべてint型であるかを調べるプログラムです。
出力を見る前にどのようなものになるか考えてみてください!

def check(array):
  if all( isinstance(x, int) for x in array):
    print("配列{}の要素はすべてint型".format(array))
  else:
    print("配列{}の要素にint型ではないものが!!".format(array))


check([2,5,6]) 
check([1,4,[]])
check(["1",2,3])
check([])
check(1)
出力結果

配列[2, 5, 6]の要素はすべてint型
配列[1, 4, []]の要素にint型ではないものが!!
配列['1', 2, 3]の要素にint型ではないものが!!
配列[]の要素はすべてint型

TypeError Traceback (most recent call last)
<省略>
TypeError: 'int' object is not iterable

予想通りでしたか?空の配列に対してもTrueがかえってきていますね。
まあ当然ですが5つめはiterableではないというエラーが出てしまいました。
これらの点には注意しましょう。

any(iterable)

さてお次はany()について書いていこうと思います。今更ですが、この2つの関数って内容が関数名のまんまだから説明の需要なさそう(笑)

iterable のいずれかの要素が真ならば True を返します。iterable が空なら False を返します。以下のコードと等価です:

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

※公式ドキュメントより

以下はanyを使った配列arrayの要素にint型があるかを調べるプログラムです。
先程と同様、出力を見る前にどのようなものになるか考えてみてください!

def check(array):
  if any( isinstance(x, int) for x in array):
    print("配列{}の要素にint型が!!".format(array))
  else:
    print("配列{}の要素にint型がまったくない!".format(array))


check([2,"5","6"]) 
check(["1","4","a"])
check([])
check([1])

出力結果

配列[2, '5', '6']の要素にint型が!!
配列['1', '4', 'a']の要素にint型がまったくない!
配列[]の要素にint型がまったくない!
配列[1]の要素にint型が!!

どうでしたか?3番は特に注意ですね。allとは違って空配列の場合Falseが帰ってきていることが分かります。まあ、それ以外とくに説明することもないか。

おわりに

いかがでしたでしょうか?解説とかそもそも需要なかった感も否めませんが、お役に立てれば幸いです。では今回はこの辺で!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2