在lisp中,我曾经做过类似的事情,知道它不会崩溃:
[3]> (mapcar #'+ '(1 2 3) '(1 2))
(2 4)
python中的等价似乎崩溃了:
>>> map(lambda x,y : x + y, [1,2,3], [1,2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
python中的函数是否与不等长度列表上的lisp版本一样?或者,有没有办法改变地图的行为?
答案 0 :(得分:5)
此问题适用于Python 2.x(感谢@ user2357112)。 Python 3.x中map
的文档说:
当最短输入迭代用尽时,迭代器停止。
所以,在Python 3.x中你可以使用map
:
In [1]: list(map(lambda a, b: a + b, [1, 2, 3], [1, 2]))
Out[1]: [2, 4]
但Python 2.x中的map
文档说:
如果一个iterable短于另一个,则假定它被扩展 没有项目。
因此,您首先应zip
这些列表:
In [2]: map(sum, zip([1, 2, 3], [1, 2]))
Out[2]: [2, 4]
因为zip
会将返回的列表截断为最短参数序列的长度(如文档中所述)
您还可以定义自己的函数zip_with
(example from this answer):
import itertools
def zip_with(f, *coll):
return itertools.starmap(f, itertools.izip(*coll))
使用示例:
In [3]: list(zip_with(operator.add, [1, 2, 3], [1, 2]))
Out[3]: [2, 4]