关于堆栈溢出,已经存在有关如何计算[Int:Int]
字典的加权平均值的问题,包括使用reduce
的奇特方法。但是我现在将数字和权重存储在两个数组中。不能保证数字相同。 什么是 Swift 方式?是否可以使用reduce
之类的Swift功能?我希望有一种方法不使用for
循环。谢谢!
let numbers = [1, 2, 4, 3, 2]
let weights = [10, 20, 30, 15, 25]
答案 0 :(得分:2)
没有for
循环:
func weightedAverage(values: [Double], weights: [Double]) -> Double {
precondition(values.count > 0 && values.count == weights.count)
let totalWeight = weights.reduce(0.0, +)
precondition(totalWeight > 0)
return zip(values, weights)
.map { $0 * $1 }
.reduce(0.0, +) / totalWeight
}
let avg = weightedAverage(values: [1, 2, 4, 3, 2], weights: [10, 20, 30, 15, 25])
print(avg)
答案 1 :(得分:1)
这是快速实现的方法:
let numbers = [14.424, 14.421, 14.417, 14.413, 14.41]
let weights = [3058.0, 8826.0, 56705.0, 30657.0, 12984.0]
let sum = weights.reduce(0, {$0 + $1})
let a = numbers.enumerated().map { (arg) -> Double in
let (index, element) = arg
return Double(element * weights[index] / sum)
}.reduce(0, {$0 + $1})
答案 2 :(得分:0)
如果您的意思是平均值:
let numbers = [1, 2, 4, 3, 2]
let weights = [10, 20, 30, 15, 25]
var average = 0
var sum = 0
weights.forEach { (num) in
average += num
}
for i in 0...numbers.count-1 {
sum += (numbers[i] * weights[i])
}
var finalValue = sum/average
print(finalValue)
答案 3 :(得分:0)
您可以使用zip并缩小:
let numbers: [Double] = [1, 2, 4, 3, 2]
let weights: [Double] = [10, 20, 30, 15, 25]
let totalWeights = weights.reduce(0, { $0 + $1 } )
let combined: [(value: Double, weight: Double)] = Array(zip(numbers, weights))
let weightedTotal = combined.reduce(0.0, { $0 + $1.value * $1.weight } )
let weightedAverage = weightedTotal/Double(numbers.count)/totalWeights
print(weightedAverage)