0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonのリスト内法表記内でのfor, ifの使用方法と、any, allとの組み合わせについて整理

Last updated at Posted at 2024-04-23

背景

リスト内法表記 + 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

これはわかる。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?