代码之家  ›  专栏  ›  技术社区  ›  WH48

基于上一个元素的每个值的百分比差异创建数组

  •  0
  • WH48  · 技术社区  · 6 年前

    var array: [Double] = [4, 5, 2, 4, 3, 6]
    

    var newArray = [0, 25, -60, 100, -25, 100]
    

    这有道理吗?非常感谢您的帮助,非常感谢!!

    4 回复  |  直到 6 年前
        1
  •  6
  •   Martin R    6 年前

    这可以很方便地用 zip() 数数

    let array: [Double] = [4, 5, 2, 4, 3, 6]
    
    let percentages = [0] + zip(array, array.dropFirst()).map {
        (old, new) in
        return 100.0 * (new - old) / old
    }
    
    print(percentages) // [0.0, 25.0, -60.0, 100.0, -25.0, 100.0]
    

    (假设所有数组元素都不为零。)

    let percentages = [0] + zip(array, array.dropFirst()).map {
        100.0 * ($1 - $0) / $0
    }
    
        2
  •  2
  •   Mo Abdul-Hameed Martheli    6 年前

    你可以这样做:

    func percentageDifference(num1: Double, num2: Double) -> Double {
        return (num2 - num1) / num1 * 100
    }
    
    var array: [Double] = [4, 5, 2, 4, 3, 6]
    var resultArray: [Double] = [0]
    
    for i in (1..<array.count) {
        resultArray.append(percentageDifference(num1: array[i-1], num2: array[i]))
    }
    
        3
  •  2
  •   Leo Dabus    6 年前

    可以使用var保留最后一个元素的引用,并使用defer在映射中更新它:

    extension Collection where Element: FloatingPoint {
        var percentageDifference: [Element] {
            guard var last = first else { return [] }
            return map { element in
                defer { last = element }
                return (element - last) / last * 100
            }
        }
    }
    

    let numbers: [Double] = [4, 5, 2, 4, 3, 6]
    let percentageDifference = numbers.percentageDifference
    print(percentageDifference)   // "[0.0, 25.0, -60.0, 100.0, -25.0, 100.0]\n"
    
        4
  •  1
  •   Cristik    6 年前

    let array: [Double] = [4, 5, 2, 4, 3, 6]
    let newArray = array.indices.map { i in (array[i] - array[max(0,i-1)]) / array[max(0, i-1)] * 100.0 }
    print(newArray) // [0.0, 25.0, -60.0, 100.0, -25.0, 100.0]
    

    有少量代码重复,但是它以一种性能良好的方式工作,我想说:)