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

标签 python-3.x

map 的签名是

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

在 Python 2.x 中,如果 functionNone,则假定身份,并且短的可迭代对象会用“None”填充到最长可迭代对象的长度。

在 Python 3.x 中,如果 functionNone,您最终会得到一个异常:

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/

相关文章:

python-3.x - Pip3 给出 "No matching distribution found for ..."错误

python - 由内而外迭代嵌套列表

python-3.x - 将频谱图存储为Python中的图像

python - 返回函数的函数(在 python 中)

windows - python 代码而不是真实文件

python - Pyinstaller 生成的 exe 无法正常运行

django - 在 Django 中提供静态 HTML

python - 将 python 中的两个 pandas 数据框与公共(public)列和字符串条件合并

python - Python 中的 Tkinter - 它应该很慢还是程序中其他地方的瓶颈?

python - 无法调用计划作业中的方法