gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:01:05 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com