map, reduce, filterによるシーケンス操作

シーケンスに対して繰り返し操作するためのビルドイン関数。forで繰り返し処理する代わりに記述できる。mapとfilterはリスト内包表記で記述でき、そちらのほうが概ね高速なのでリスト内包表記で記述したほうが良い。

map: すべての要素に処理を行う

シーケンスのすべての要素を関数の引数として実行し、その実行結果から新しいlistを作成する。

>>> items = [1, 2, 3]
>>> def plus(n):         # 10加算して返すだけの関数plus
...   return n+10
...
>>> map(plus, items)     #itemsの要素すべてにplus関数の実行し、新しいlistを返す
[11, 12, 13]
>>> items                #元のitemsは変更されない
[1, 2, 3]

>>> map(lambda n:n+20, items)   #関数部分をlambda関数で指定
[21, 22, 23]

>>> [x+20 for x in items]       #同じ事をリスト内包表記で(最適な方法)
[21, 22, 23]

filter: 条件に一致する要素のみ抽出する

シーケンスのすべての要素を関数の引数として実行し、Trueを返却した要素のみから新しいlistを作成する。

>>> filter(lambda n:n%2==1, items)     #lambda関数がTrueを返す要素(奇数)要素のみ抽出する
[1, 3]
>>> items             #itemsは不変
[1, 2, 3]

>>> [x for x in items if x%2==1]       #同じ事をリスト内包表記で。(最適な方法)
[1, 3]

reduce: 全部まとめて1つに

シーケンスのすべての要素をまとめて1つの値に集約します。集約する方法は、引数を2つ受け取る関数を用意します。
関数は最初1番目、2番目の要素を受け取りその集約結果を返します。次にその集約結果を引数1に、3番目の要素を引数2に受け取ります。この繰り返しですべての要素を処理します。

文章で書くとややこしいですが、コードを書くと簡単です。

>>> def add_func(a, b):
...   return a+b
...
>>> items = [1, 2, 3]
>>> reduce(add_func, items)        # add_func(add_func(1, 2), 3)
6
関連記事:

map, reduce, filterによるシーケンス操作」への2件のフィードバック

  1. Nobu

    はじめまして。python初心者のNobuと申します。
    毎度、参考にさせて頂いています。
    「map: すべての要素に処理を行う」の項で、プロンプト上(cui)で実行すると、itemsの内容が+10nに変更になりますが、GUI(総合開発環境Geany)での実行の時に処理する時に、どの様にすれば良いか解りません。ご教授いただけますか?宜しくお願いいたします。

    返信
    1. admin

      Geanyの使い方が分からないということでしたら、Geanyについて調べたらいいかと思います。
      たぶん、新規にPythonファイルを作成して、書いたコードを実行すればよいかと思います。

      返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)