map
的签名是
map(function, iterable[, iterables[, ...]])
在 Python 2.x 中,如果 function
是 None
,则假定身份,并且短的可迭代对象会用“None”填充到最长可迭代对象的长度。
在 Python 3.x 中,如果 function
为 None
,您最终会得到一个异常:
TypeError: 'NoneType' object is not callable
并且所有可迭代对象都被修剪为最短的长度。
这是一些非常剧烈的变化。我如何恢复 2.x 语义?
哦,它现在返回一个迭代器而不是一个列表,但我接受这个改变。 ;)
这对于您事先不知道将应用哪个函数(如果有)的情况非常有用——仅仅因为您实际上没有转换可迭代对象并不意味着您不需要它的内容。
最佳答案
您必须自己动手——但这很容易:
from itertools import zip_longest, starmap
def map2x(func, *iterables):
if len(iterables) == 1:
zipped = list(iterables[0])
else:
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)]
如果你只有一个可迭代对象,比如:
map(None, 'hello world')
然后只需将其替换为:
list('hello world')
更新:
如果您使用 None
作为函数调用 map()
并且只有一个可迭代对象,那么我在这里的原始答案不起作用。那是因为没有人这样做,从那时起你也可以使用 list(iterable)
。但无论如何,我还是应大众要求添加了对该案例的处理。 :-)
关于python-3.x - 如何在 Python3.x 中获得 Python2.x `map` 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8072755/