この記事は?
JavaScript 版はこちら (言語が違う以外ほぼ同じ):
Python の list
において、「各要素に対してこうする」というコードを書く機会がしばしばあります。基本的な実装方法は、「for
ループ書いて処理」です。
しかし、for
を用いずにそれを実現できるビルトイン関数があります。上手く使えると、コード量を削減し、より簡潔に記述することができます。
ただし、可読性などの観点で、for のままのが良いシチュエーションもあるので注意。 各要素に対して複雑な処理をするのであれば、for
で書いた方が無難です。
前提知識 - lambda
式
次の 2つのコードは、いずれも「引数を 2倍した値を返す関数を、何らかのメソッドに渡す」という動作で等価です。
def func(e):
return e*2
any.method(func)
any.method(lambda e: e*2)
lambda
を使用すると、関数の名前が不要 (無名関数) だったり return
が不要だったりで、一行にコンパクトに関数を記述できます。
Array 各要素に対し、任意の処理をする
例: 各要素を 2倍にする
in_list = [1, 2, 3, 4]
out_list = []
for e in in_list:
out_list.append(e * 2)
# out_list: [2, 4, 6, 8]
in_list = [1, 2, 3, 4]
out_list = map(lambda e: e*2, in_list)
# out_list: [2, 4, 6, 8]
map()
の引数に、処理内容を定義した関数、処理する list
(厳密にはイテラブル) を指定します。1
を引数に関数 e: e*2
が、次は 2
3
4
を引数にと繰り返します。その関数の帰り値が、出力される map オブジェクト (ここでは output
) の要素に入れられます。
map オブジェクト: list
と同じくイテラブルなオブジェクト, list(output)
というようにやれば list
に変換可能
(2024/02/01 追記, @shiracamus さんよりコメント)
リストの内包表記を用いると以下のようになります。こちらは list
型で出てくるので、より簡潔に済みます。
in_list = [1, 2, 3, 4]
out_list = [e*2 for e in in_list]
(追記ここまで)
Array から特定条件の要素のみ取り出す
例: 偶数だけ取り出す
array = [1, 2, 3, 4]
array_even = []
for e in array:
if e % 2 == 0:
array_even.append(e)
# array_even: [2, 4]
array = [1, 2, 3, 4]
array_even = filter(lambda e: (e % 2) == 0, array)
# array_even: [2, 4]
map()
同様、各要素に対して filter()
の引数に渡した関数が呼び出されます。関数の返り値が true
なら出力する filter オブジェクト (ここでは array_even
) に入れ、false
なら除かれます。
filter オブジェクト: map と似た感じ、以下同文
(2024/02/01 追記, @shiracamus さんよりコメント)
リストの内包表記を (以下同文
array = [1, 2, 3, 4]
array_even = [e for e in array if (e % 2) == 0]
(追記ここまで)
ある値が複数あるいずれかと一致するか
例: 入力されたワードが曜日であるか確認する
in_text = "mon"
day_of_the_week = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]
is_input_true = False
for e in day_of_the_week:
if in_text == e:
is_input_true = True
break
# is_input_true: True
in_text = "mon"
day_of_the_week = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]
is_input_true = in_text in day_of_the_week
# is_input_true: true
in
の左辺と一致する値が右辺の中にあれば true
、なければ false
を返します。
先の 2つは関数でしたが、これは演算子の一つです。
あとがき - 標準リファレンスを見てみよう
リーダブルコードにて、こんな旨のアドバイスがありました。(文はうろ覚え)
たまに標準 API の仕様書を読んでみると良い。
全部完璧に覚える必要は無い。
だが、何となく覚えておいたものが、急に役立つことがある。
実際、Python 公式ドキュメントで標準ライブラリを調べてみると、けっこう色々な関数やらがあるのが分かります。それを読んでいくと、「あれ?あの時に書いたやつ、このメソッドで一発・・・」なんて出会いがあるかも。