__str()__
>>> lst_ = [1]
>>> map(lambda x, y: x + y if y else 1, lst_, lst_[1:])
[1]
我想知道为什么python2返回正确的结果,但python3返回无
我应该如何使用python3修改代码以返回正确的结果
答案 0 :(得分:5)
这是对map()
函数功能的更改(以及对成为迭代器的更改)。由于输入现在是迭代器,map()
已更新为遵循与zip()
相同的行为,而不是使用None
值填充较短的输入。
比较documentation for map()
in Python 2:
如果一个iterable短于另一个,则假定使用
None
项进行扩展。
对于多个迭代,迭代器在最短的iterable耗尽时停止。
您可以将itertools.zip_longest()
与itertools.starmap()
一起使用以再次获取Python 2行为:
from itertools import starmap, zip_longest
starmap(lambda x, y: x + y if y else 1, zip_longest(lst_, lst_[1:]))
zip_longest()
具有额外的优势,您现在可以指定要用作填充的值;例如,您可以将其设置为0
:
starmap(lambda x, y: x + y, zip_longest(lst_, lst_[1:], fillvalue=0))
演示:
>>> from itertools import starmap, zip_longest
>>> lst_ = [1]
>>> list(starmap(lambda x, y: x + y if y else 1, zip_longest(lst_, lst_[1:])))
[1]
>>> list(starmap(lambda x, y: x + y, zip_longest(lst_, lst_[1:], fillvalue=0)))
[1]