如何在Python3.x中获得Python2.x`map`功能?

时间:2011-11-09 22:39:18

标签: python-3.x

map的签名是

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

在Python 2.x中,假设functionNone,则使用“无”填充短迭代到最长迭代的长度。

在Python 3.x中如果functionNone,则最终会出现异常:

TypeError: 'NoneType' object is not callable

并且所有迭代都被修剪为最短的长度。

这是一些非常激烈的变化。我如何获得2.x语义?

哦,现在它返回一个迭代器而不是一个列表,但我对这个改变没问题。 ;)


这对于您事先不知道将应用哪个函数(如果有的话)的情况非常有用 - 仅仅因为您实际上并未转换迭代,并不意味着您不想要其内容。

1 个答案:

答案 0 :(得分: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)]