不等长列表上的Python映射

不等长列表上的Python映射,python,Python,在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>"

在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'
地图(λx,y:x+y,[1,2,3],[1,2]) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“”,第1行,在 TypeError:不支持+:'int'和'NoneType'的操作数类型
python中是否有一个函数可以像lisp版本一样在非等长列表上工作?或者,有没有办法改变map的行为

这个问题适用于Python2.x(感谢@user2357112)。Python 3.x中的文档说明:

当最短输入iterable耗尽时,迭代器停止

因此,在Python3.x中,您可以使用
map

In [1]: list(map(lambda a, b: a + b, [1, 2, 3], [1, 2]))
Out[1]: [2, 4]

但是Python 2.x中的文档说明:

如果一个iterable比另一个iterable短,则假定它是扩展的 没有任何项目

因此,您首先应该列出以下列表:

In [2]: map(sum, zip([1, 2, 3], [1, 2]))
Out[2]: [2, 4]
因为
zip
将把返回的列表截断为最短参数序列的长度(如文档中所述)

您还可以使用()定义自己的函数
zip\u:

用法示例:

In [3]: list(zip_with(operator.add, [1, 2, 3], [1, 2]))
Out[3]: [2, 4]

这个问题适用于Python2.x(感谢@user2357112)。Python 3.x中的文档说明:

当最短输入iterable耗尽时,迭代器停止

因此,在Python3.x中,您可以使用
map

In [1]: list(map(lambda a, b: a + b, [1, 2, 3], [1, 2]))
Out[1]: [2, 4]

但是Python 2.x中的文档说明:

如果一个iterable比另一个iterable短,则假定它是扩展的 没有任何项目

因此,您首先应该列出以下列表:

In [2]: map(sum, zip([1, 2, 3], [1, 2]))
Out[2]: [2, 4]
因为
zip
将把返回的列表截断为最短参数序列的长度(如文档中所述)

您还可以使用
()定义自己的函数
zip\u:

用法示例:

In [3]: list(zip_with(operator.add, [1, 2, 3], [1, 2]))
Out[3]: [2, 4]

请注意,
lambda(x,y):x+y
中的参数unpacking在Python3中不起作用。这使得Python3中的转换有点混乱。幸运的是,Python3的
map
已经满足了您的要求。您链接的文档是针对Python3版本的
map
,这些都不是必需的。请注意,
lambda(x,y):x+y
中的参数解包在Python3中不起作用。这使得Python3中的转换有点混乱。幸运的是,Python3的
map
已经实现了您想要的功能。您所链接的文档是针对Python3版本的
map
,而这些都不是必需的。