不等长列表上的Python映射
在lisp中,我经常这样做,因为我知道它不会崩溃:不等长列表上的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>"
[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
,而这些都不是必需的。