Pythonでの関数map()とreduce()の使用法

高洛峰
リリース: 2017-03-11 10:06:01
オリジナル
1934 人が閲覧しました

この記事では主にPythonのmap()関数とreduce()関数の使い方を紹介しています。コードはPython2.xバージョンに基づいていますので、必要な方は参考にしてください

Pythonにはmap()関数とreduce関数が組み込まれています。 () 機能。

Googleの有名な論文「MapReduce: Simplified Data Processing on Large Clusters」を読んでいれば、map/reduceの概念は大体理解できると思います。

まず地図を見てみましょう。 map() 関数は 2 つのパラメータを受け取り、1 つは関数、もう 1 つはシーケンスです。渡された関数をシーケンスの各要素に順番に適用し、結果を新しいリストとして返します。

たとえば、関数 f(x)=x2 があり、この関数をリスト [1, 2, 3, 4, 5, 6, 7, 8, 9] に適用したい場合、使用できるmap()は次のように実装されます:

2015427113120966.png (341×245)

次に、Pythonコードで実装します:

>>> def f(x):
...   return x * x
...
>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]
ログイン後にコピー

map()に渡される最初のパラメータは、関数オブジェクトであるfです。自体。

map() 関数を使わずにループを記述して結果を計算できると思うかもしれません:

L = []
for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
  L.append(f(n))
print L
ログイン後にコピー

確かにそれは可能ですが、上記のループコードから、一目で「put f を実行する」ことがわかります。 ( "x) はリストの各要素に作用し、新しいリストを生成します"?

つまり、map() は高階関数として実際に演算規則を抽象化するので、単純な f(x)=x2 を計算するだけでなく、あらゆる複雑な関数、たとえばすべての関数を計算することもできます。このリストでは、数値を文字列に変換します:

>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
['1', '2', '3', '4', '5', '6', '7', '8', '9']
ログイン後にコピー

必要なコードは 1 行だけです。

reduce の使い方を見てみましょう。 reduce は関数をシーケンス [x1, x2, x3...] に適用します。この関数は 2 つのパラメーターを受け取る必要があります。reduce はシーケンスの次の要素で結果の累積計算を続けます。

reduce( f) , [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

たとえば、シーケンスを合計するには、reduce を使用して実装できます:

>>> def add(x, y):
...   return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
ログイン後にコピー

もちろん、合計演算は Python の組み込み関数 sum() を使用して直接実行でき、reduce を使用する必要はありません。

しかし、シーケンス [1, 3, 5, 7, 9] を整数 13579 に変換したい場合は、reduce が便利です:

>>> def fn(x, y):
...   return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579
ログイン後にコピー

この例自体はあまり役に立ちませんが、文字列 str もシーケンスです。上記の例を少し変更して、map() を使用すると、str を int に変換する関数を作成できます。

>>> def fn(x, y):
...   return x * 10 + y
...
>>> def char2num(s):
...   return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
...
>>> reduce(fn, map(char2num, '13579'))
13579
ログイン後にコピー

str2int にまとめられた関数は次のとおりです。

def str2int(s):
  def fn(x, y):
    return x * 10 + y
  def char2num(s):
    return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
  return reduce(fn, map(char2num, s))
ログイン後にコピー

は、ラムダ関数を使用してさらに簡略化することもできます:

def char2num(s):
  return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
ログイン後にコピー

def str2int(s):
  return reduce(lambda x,y: x*10+y, map(char2num, s))
ログイン後にコピー

つまり、Python が int() 関数を提供しないと仮定すると、次のように自分で関数を書くことができます。文字列を整数関数に変換するだけで、数行のコードが必要になります。

演習

map() 関数を使用して、ユーザーが入力した非標準の英語名を、最初の文字が大文字、その他が小文字の標準名に変更します。入力: ['adam'、'LISA'、'barT']、出力: ['Adam'、'Lisa'、'Bart']。

Pythonが提供するsum()関数はリストを受け取って合計を計算することができます。リストを受け取って積を計算するためにreduce()を使用できるprod()関数を作成してください。


以上がPythonでの関数map()とreduce()の使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート