map
的签名是
map(function, iterable[, iterables[, ...]])
在Python 2.x中,假设function
为None
,则使用“无”填充短迭代到最长迭代的长度。
在Python 3.x中如果function
为None
,则最终会出现异常:
TypeError: 'NoneType' object is not callable
并且所有迭代都被修剪为最短的长度。
这是一些非常激烈的变化。我如何获得2.x语义?
哦,现在它返回一个迭代器而不是一个列表,但我对这个改变没问题。 ;)
这对于您事先不知道将应用哪个函数(如果有的话)的情况非常有用 - 仅仅因为您实际上并未转换迭代,并不意味着您不想要其内容。
答案 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)]