LoginSignup
2
3
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

Python の for ループの代替品

Last updated at Posted at 2024-01-31

この記事は?

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 公式ドキュメントで標準ライブラリを調べてみると、けっこう色々な関数やらがあるのが分かります。それを読んでいくと、「あれ?あの時に書いたやつ、このメソッドで一発・・・」なんて出会いがあるかも。

2
3
3

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
2
3