23
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonのリストから条件に合致する最初の要素を検索(find)する方法

Last updated at Posted at 2020-05-03

概要

JavaScriptでいうArray.prototype.find()的な操作をPythonで行う方法について調べたメモ。

javascriptのfind()
const fruits = ["apple", "lemon", "melon", "orange"];
const elm = fruits.find(e => e.endsWith("n"));
console.log(elm); // "lemon"

filter関数を用いた方法

filter関数はラムダ式で記述された無名関数を第1引数で受け取り、それを第2引数のリストの各要素に適用する。結果が真となった要素を抽出してイテレータが返されるので、list関数を適用すればリストとして結果が得られる。

filter関数
    fruits = ["apple", "lemon", "melon", "orange"]
    # filter関数
    lst = list(filter(lambda x: x.endswith("n"), fruits))
    assert lst == ["lemon", "melon"]
    # filter関数 合致する要素なし
    lst = list(filter(lambda x: x.endswith("x"), fruits))
    assert lst == []

list関数の代わりにnext関数を適用すれば、条件に合致する最初の要素が得られる。
next関数の第2引数には、要素が見つからなかった場合のデフォルト値としてNoneを指定しておく。(この指定がないと、StopIteration例外が送出されて異常終了するので注意)

filter関数+next関数によるfind
    # filter関数によるfind
    elm = next(filter(lambda x: x.endswith("n"), fruits), None)
    assert elm == "lemon"
    # filter関数によるfind 合致する要素なし
    elm = next(filter(lambda x: x.endswith("x"), fruits), None)
    assert elm == None

ジェネレータ式によるfind

ジェネレータ式とは、リスト内包表記のような記法でジェネレータを定義する式。ジェネレータとはイテレータを返すものなので、next関数に渡すことができる。

ジェネレータ式+next関数によるfind
    # ジェネレータ式によるfind
    elm = next((f for f in fruits if f.endswith("n")), None)
    assert elm == "lemon"
    # ジェネレータ式によるfind 合致する要素なし
    elm = next((f for f in fruits if f.endswith("x")), None)
    assert elm == None

第1引数がジェネレータ式。リスト内包表記との違いは、[ ]でなく( )で囲む点。

ジェネレータ式
(f for f in fruits if f.endswith("x"))
23
13
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
23
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?