在lisp中,我曾经做过类似的事情,知道它不会崩溃:
[3]> (mapcar #'+ '(1 2 3) '(1 2))
(2 4)
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)
python中的函数是否与不等长度列表上的lisp版本一样工作?或者,有没有办法改变地图的行为?
此问题适用于Python 2.x(感谢@ user2357112).mapPython 3.x中的文档说:
当最短输入可迭代用尽时,迭代器停止.
所以,在Python 3.x中你可以使用map:
In [1]: list(map(lambda a, b: a + b, [1, 2, 3], [1, 2]))
Out[1]: [2, 4]
Run Code Online (Sandbox Code Playgroud)
但是mapPython 2.x中的文档说:
如果一个iterable比另一个短,则假定使用None项扩展.
那么,首先应该是zip这些列表:
In [2]: map(sum, zip([1, 2, 3], [1, 2]))
Out[2]: [2, 4]
Run Code Online (Sandbox Code Playgroud)
因为zip会将返回的列表截断为最短参数序列的长度(如文档中所述)
您还可以定义自己的函数zip_with(来自此答案的示例):
import itertools
def zip_with(f, *coll):
return itertools.starmap(f, itertools.izip(*coll))
Run Code Online (Sandbox Code Playgroud)
用法示例:
In [3]: list(zip_with(operator.add, [1, 2, 3], [1, 2]))
Out[3]: [2, 4]
Run Code Online (Sandbox Code Playgroud)