映射不同长度的迭代器

时间:2012-11-12 17:16:45

标签: python python-2.7 itertools

我正在回答this question并面临以下问题:

>>> from operator import add
>>> map(add,[1,2,3],[1,2])

Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
    map(add,[1,2,3],[1,2])
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

我希望map在参数中提供的最小迭代器被消耗后立即停止。

我找到了解决方案:

>>> from itertools import imap
>>> list(imap(add,[1,2,3],[1,2]))
[2, 4]

但是,为什么呢?他们的行为不应该一致吗?

这是解决问题的最佳方法吗?

2 个答案:

答案 0 :(得分:4)

itertools.imap说明中所述:

  

创建一个迭代器,使用每个迭代的参数计算函数。如果function设置为None,则imap()将参数作为元组返回。 与map()类似,但在最短的iterable耗尽时停止,而不是为更短的iterables填充None。差异的原因是无限迭代器参数通常是map()的错误(因为输出被完全评估),但代表了向imap()提供参数的常用且有用的方法。

答案 1 :(得分:2)

怎么样:map(sum, zip([1,2,3],[4,5]))

相关问题