背景
リスト内法表記 + any, all関数の使い方について整理する。
リストから、特定の条件にマッチする要素を取得する
例:リストから奇数の要素を取得する
>>> a = [1,2,3,4,5]
>>> [x for x in a if x % 2 == 1]
[1, 3, 5]
リスト全体に対して、特定の条件にマッチするかを判定する
例:リスト内に奇数の要素が存在するかを判定する
>>> any([x % 2 == 1 for x in a])
True
>>>
例:リスト内の全要素が奇数かを判定する
>>> all([x % 2 == 1 for x in a])
False
余談
記事を書いた背景
リスト内の全要素が奇数かを判定する。を実装する際に以下のようにしたら想定と動作が違った。
>>> all([x for x in a if x % 2 == 1])
True
forの右側でif判定する際には、判定結果に合致する要素を取得する。
>>> [x for x in a if x % 2 == 1]
[1, 3, 5]
forの左側で判定する際には、各要素が条件に合致するかをboolで返す。
>>> [x % 2 == 1 for x in a]
[True, False, True, False, True]
>>>
any()やall()に渡す場合は後者にしないと結果がおかしくなる。
any()、all()の挙動について
公式ドキュメントより( https://docs.python.org/ja/3/library/functions.html#all )、
all()は以下の実装になっている。
def all(iterable):
for element in iterable:
if not element:
return False
return True
なので、 all([]) == True
になる。
>>> all([])
True
これは直観と異なるので注意が必要(個人の感想です)。
ちなみにanyは以下。
def any(iterable):
for element in iterable:
if element:
return True
return False
これはわかる。