2014-12-07 73 views
1

我想實現我自己的Python映射函數版本。我稱它爲my_map。約束條件是使用函數式編程(如果語句允許,循環不允許)。執行映射返回列表而不是列表

這裏的實現:

# f is the function it takes in, and ls is the list to apply this function over. 
def my_map(f, ls): 
    if len(ls) != 1: 
     ret = my_map(f, ls[1:]) 
     return [f(ls[0])] + [ret] 
    else: 
     return f(ls[0]) 

但是當我運行這個具有以下輸入:

def f(x): 
    return x * x 

my_map(f, [1,2,3,4])回報[1, [4, [9, 16]]]

map(f, [1,2,3,4])回報[1, 4, 9, 16],這是我的期望。

關於如何獲得預期結果的任何想法?

回答

3
return [f(ls[0])] + [ret] 

應該

return [f(ls[0])] + ret 

。您正在從ret創建一個新的單元素列表,但只有第一個應該是單元素列表。

此外,發電機可能會更有效。你正在製作大量的部分列表。

def my_map(f, ls): 
    it = iter(ls) 

    def go(): 
     yield f(next(it)) 
     yield from go() 

    return list(go()) 
+1

我得到這個:類型錯誤:只能串聯列表(不是 「INT」)列出 – periphery 2014-12-08 00:02:30

+0

@periphery:呵呵,上次'返回F(LS [0])'應該是'返回[F(LS [0])]'。 – Ryan 2014-12-08 00:04:05

+0

謝謝,這個工程。我還找到了另一種方式來做到這一點,我也加了一個答案。 – periphery 2014-12-08 00:07:19