2017年7月9日 星期日

[Python]Map-and-reduce

1.
map的語法是 map(fn,var),作用為將 fn 作用在var上,一般來說var是list。map將var上的元素,這邊我們姑且認為var是一個list,將list上的元素一一丟入fn中進行運算,然後產生一個list





ex:

def add(x):
   return x+1;

l=[1,2,3]

a=map(add,l)
print(a) #2,3,4

當然覺得map不好用也可以用for去改寫
L=[]

for i in l:
   L.append(add(i))

print(L) #2,3,4

但是,但是,這樣產生兩個list

2. reduce

map是將元素丟到函式運算,產生一個iterator的序列,但reduce不一樣,reduce則是將結果累加,需要兩個參數處理

以上面的例子改寫

def add(x,y):
   return x+y;

l=[1,2,3]

recude(add,l) #6

使用reduce時要先import reduce,
from functools import reduce

這邊參考前述的網站,做幾個題目,採用map / reduce

EX 1 :
將lisr中的字串手字改為大寫,其他小寫
L=['ADMIN','WaLse','lisa]

And :
def normalize(s):
   retrun s[0].upper()+s[1:].lower()

a=map(normalize,L)
print(a) # ['Admin','Walse','Lisa']

EX2:

傳入L,求L中元素的乘積,例如[1,2,3,4],等於24

L=[3,5,7,9]

def prod(L):
    def multi(x,y)
        return x*y
    return reduce(multi,L)

print( '[3,5,7,9]',prod(L)) # 945

EX3:

利用 reduce將str轉float

def str2float(s)
  dot=0
  for i in range(len(s)):
      if s[i]=='.':
          s=s[:i]+s[i+1:]
          dot=i
          break;

 def fn(x,y):
    return x*10+y
 def chr2num(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(chr2num, s)) / 10 ** dot

print(str2float('123.45')) #123.45

稍微講一下
if做的是算出 "." 的位置,並將算出的位置給dot變數,然後建立一個加總的fn 還有一個char 轉num的函式 放到s中,最後利用map跟reduce輸出結果,但是因為有小數點,所以除上 10 ** dot做最後的計算

為了不混淆輸入的參數 s 等於輸出的 s,將輸出的變數改為a稍微改寫一下

def str2float(s)
  dot=0
  for i in range(len(s)):
      if s[i]=='.':
          a=s[:i]+s[i+1:]
          dot=i
          break;

 def fn(x,y):
    return x*10+y
 def chr2num(a):
    return  {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[a]

return reduce(fn, map(chr2num, a)) / 10 ** dot

print(str2float('123.45')) #123.45







沒有留言:

張貼留言

[Python] Partial function

在Python中有許多偏函數( Partial function)可以使用,常見的就是string的轉換 ex : int('50') #50 這個例子就是把string type的50轉換成int的50,而且是10進制 那好,問題來了,能不能變成8...