Python映射不等长列表

时间:2014-07-10 09:23:43

标签: 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>", line 1, in <lambda>
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

python中的函数是否与不等长度列表上的lisp版本一样?或者,有没有办法改变地图的行为?

1 个答案:

答案 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_withexample 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]