我是Go的新手,我正在做以下事情:
我有一个片段:
valueList := []int16{500, 400, 0, 300}
和重量片:
weightList := []float64{0.1, 0.2, 0.3, 0.4}
现在我想这样做:
res := make([]float64, 4)
for i, value := range valueList {
res[i] = float64(value) * weightList[i]
}
但正如您所看到的,我在0
中获得了valueList
,现在我想将权重平均为其他值,如果值不是0
,那么在此示例中,它应该是:
500 * (0.1 + 0.3/3) + 400 * (0.2 + 0.3/3) + 300 * (0.4 + 0.3/3)
如果显示另一个0
,请再次平均重量。
我怎么能这么做呢?
答案 0 :(得分:3)
您可以在迭代它们的同时计算非零值的总和权重,并在末尾用总和权重进行除法:
vs := []int{500, 400, 0, 300}
ws := []float64{0.1, 0.2, 0.3, 0.4}
sumWeight, avg := 0.0, 0.0
for i, v := range vs {
if v == 0 {
continue
}
sumWeight += ws[i]
avg += float64(v) * ws[i]
}
avg /= sumWeight
fmt.Println("Average:", avg)
输出(在Go Playground上尝试):
Average: 357.1428571428571
注意:强>
此解决方案不要求权重总计1.0
,也不要在0..1
的范围内(但它们不能为负数)。
注意#2:
如果输入切片为空(通过len == 0
或所有值为0
)或sumWeight
非零值为0.0
,则结果为NaN
因sumWeight
除以0.0
而被if sumWeight > 0.0 {
avg /= sumWeight
}
。您可能需要检查此案例并执行其他操作:
find()