使用map解压缩迭代

时间:2017-05-18 05:57:42

标签: python python-3.x itertools iterable-unpacking

假设我有两个相同长度的数字迭代

weights = range(0, 10)
values = range(0, 100, 10)

我需要计算加权和。我知道可以用列表理解来完成

weighted_sum = sum(weight * value for weight, value in zip(weights, values))

我想知道是否可以使用mapoperator.mul

来完成
import operator

weighted_sum = sum(map(operator.mul, zip(weights, values)))

但这会产生错误

Traceback (most recent call last):
  File "<input>", line 3, in <module>
TypeError: op_mul expected 2 arguments, got 1

所以我的问题:是否有任何方法可以使用map将解压缩的元组传递给函数?

3 个答案:

答案 0 :(得分:4)

试试这个:

>>> import operator
>>>
>>> weights = range(0, 10)
>>> values = range(0, 100, 10)
>>> sum(map(lambda i:operator.mul(*i), zip(weights, values)))
2850

或者

>>> sum(map(operator.mul, weights, values))
2850

答案 1 :(得分:4)

map不需要zip,只需使用

即可
weighted_sum = sum(map(operator.mul, weights, values))

来自map's Documentation

  

如果传递了其他可迭代参数,则函数必须使用那么多参数,并且并行地应用于所有迭代中的项。

map的文档中还提到,您可以使用itertools.starmap代替map来获取zip ped输入。

作为Rahul hinted at,在处理数字时,使用numpy总是一个好主意,实际上就像

import numpy as np

np.asarray(weights) * values

已经应该这样做了(虽然与map相比,这个要求两个数组的长度相同,而map会映射最短的长度。) / p>

答案 2 :(得分:2)

您也可以尝试numpy

In [45]: import numpy as np

In [46]: sum(map(np.multiply,weights,values))
Out[46]: 2850

根据Tobias Kienzler的建议,

In [52]: np.sum(np.array(weights) * values)
Out[52]: 2850