用存储在两个数组中的数字和权重计算加权平均值

时间:2018-10-24 17:58:55

标签: swift math

关于堆栈溢出,已经存在有关如何计算[Int:Int]字典的加权平均值的问题,包括使用reduce的奇特方法。但是我现在将数字和权重存储在两个数组中。不能保证数字相同。 什么是 Swift 方式?是否可以使用reduce之类的Swift功能?我希望有一种方法不使用for循环。谢谢!

let numbers = [1, 2, 4, 3, 2]
let weights = [10, 20, 30, 15, 25]

4 个答案:

答案 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)