2011-11-09 27 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:它应该只是为了避免循环导入,或者如果你有错误的模块,只需要导入,如果你真的需要它们。否则它会减慢速度并使代码混乱。 –