Python mapとreduce関数の使用例

2379 ワード

まずmapを見ます.map()関数は2つのパラメータを受信し、1つは関数であり、1つはシーケンスであり、mapは入力した関数をシーケンスの各要素に順次作用させ、結果を新しいlistとして返す.
例えば、例えば、list[1,2,3,4,5]にこの関数を作用させるには、map()を用いて以下のように実現することができる関数a(x)=x*2がある.
 
  
>>> def a(x):
...     return x * 2
...
>>> map(a, [1,2,3,4,5])
[2, 4, 6, 8, 10]

mapが入力した最初のパラメータa、すなわちa関数は、もちろんmap関数を使わずにこの機能を実現することもできます.
 
  
>>> list = []
>>> for i in [1, 2, 3, 4, 5]:
...     list.append(a(i))
...
>>> print list
[2, 4, 6, 8, 10]

コード量から言えば、mapはずっと簡略化されているので、map()は高次関数として、実際には演算規則を抽象化しているので、簡単なa(x)=x*2を計算するだけでなく、任意の複雑な関数を計算することができます.例えば、このlistのすべての数字を文字列に変換することができます.
 
  
>>> map(str,[1,2,3,4,5])
['1', '2', '3', '4', '5']
>>>

1行のコードだけで終わります.顧雪峰pythonチュートリアルからの練習問題を見てみましょう.map()関数を利用して、ユーザーが入力した規範的でない英語の名前を、頭文字の大文字、その他の小文字の規範の名前に変えます.入力:[‘adam',‘LISA',‘bart'],出力:[‘Adam',‘Lisa',‘Bart'].私個人としては、まず規範化されていない英語名を小文字に変換してからcapitalize()関数を通じて、頭文字を小文字に変換するかもしれません.コードは以下の通りです.
 
  
>>> def caps(name):
...     return name.capitalize()
...
>>> def lowers(name):
...     return name.lower()
...
>>> map(caps, map(lowers,['adam', 'LISA', 'barT']))
['Adam', 'Lisa', 'Bart']

reduceの使い方を見てみましょう.reduce(function,sequence,starting_value):sequenceのitemに対してfunctionを繰り返し呼び出し、starting_がある場合valueは、初期値として呼び出すこともでき、例えばListの合計を求めるために使用することができる.
 
  
>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
>>> reduce(add, range(1, 11))
55
>>> reduce(add, range(1, 11),20)
75

もちろん求和演算はPython内蔵関数sum()を直接用いることができ,reduceを用いる必要はない.しかし、シーケンス[1,2,3,4,5,6,7]を整数1234567に変換すると、reduceは役に立ちます.
 
  
>>> def fn(x, y):
...     return x * 10 + y
...
>>> reduce(fn, [1,3,4,5,6,7])
134567