python3:在map中使用三元运算符,它将返回None

时间:2017-06-13 15:20:21

标签: python python-3.x functional-programming

对于python 2.7.13

__str()__

对于python 3.6.1

>>> lst_ = [1]
>>> map(lambda x, y: x + y if y else 1, lst_, lst_[1:])
[1]

两个问题:

  • 我想知道为什么python2返回正确的结果,但python3返回无

  • 我应该如何使用python3修改代码以返回正确的结果

1 个答案:

答案 0 :(得分:5)

这是对map()函数功能的更改(以及对成为迭代器的更改)。由于输入现在是迭代器map()已更新为遵循与zip()相同的行为,而不是使用None值填充较短的输入。

比较documentation for map() in Python 2

  

如果一个iterable短于另一个,则假定使用None项进行扩展。

使用Python 3 version

  

对于多个迭代,迭代器在最短的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]