2011-11-09 28 views
3

簽名爲map如何在Python3.x中獲得Python2.x`map`功能?

map(function, iterable[, iterables[, ...]]) 

在Python 2.x的,如果是function身份None假設,和短iterables與「無」到最長可迭代的長度填充。

在Python 3.x中,如果functionNone,你最終會得到一個異常:

TypeError: 'NoneType' object is not callable 

和所有iterables被修剪到最短的長度。

這是一對非常激烈的變化。我如何獲得2.x語義?

哦,它現在返回一個迭代器而不是一個列表,但我對這個變化沒問題。 ; - 只是因爲你沒有真正轉化迭代並不意味着你不)


,你不提前知道哪些功能,如果有的話,將被應用的時間。這是非常有用的情況不想要它的內容。

+0

注意,這無關功能是「無」或沒有。你不會「最終」得到錯誤,你第一次得到它。你根本無法再通過None。問題在於,Python 3中的map()會在最短的迭代中停止。我不確定爲什麼這個改變完成了。 –

回答

5

你必須推出自己的 - 但它很容易:

from itertools import zip_longest, starmap 

def map2x(func, *iterables): 
    zipped = zip_longest(*iterables) 
    if func is None: 
     return zipped 
    return starmap(func, zipped) 

一個簡單的例子:

a=['a1'] 
b=['b1','b2','b3'] 
c=['c1','c2'] 

print(list(map2x(None, a, b, c))) 

這給了我們:

[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)] 
+0

我不同意不導入內部函數('from ... import *'除外 - 這絕對不好,以及在Python 3.x中不允許),但我喜歡你的其他改進。謝謝! –

+0

@EthanFurman:它應該只是爲了避免循環導入,或者如果你有錯誤的模塊,只需要導入,如果你真的需要它們。否則它會減慢速度並使代碼混亂。 –