概要
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"))