假设我有两个相同长度的数字迭代
weights = range(0, 10)
values = range(0, 100, 10)
我需要计算加权和。我知道可以用列表理解来完成
weighted_sum = sum(weight * value for weight, value in zip(weights, values))
我想知道是否可以使用map
和operator.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
将解压缩的元组传递给函数?
答案 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
的文档中还提到,您可以使用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