假设我有一个数字列表。如何将列表转换为其“增量”列表 - 后续数字的成对差异?
例如:给定List(5, 2, 1, 1)
我想获得List(3, 1, 0)
答案 0 :(得分:15)
正确的答案是
(xs, xs drop 1).zipped.map(_-_)
当你传递一个空的或一位数的列表时,它甚至不会爆炸。
答案 1 :(得分:10)
List(5,2,1,1).sliding(2).map(pair => pair(0) - pair(1))
答案 2 :(得分:5)
另外两种可能的解决方案:
list.zip(list.drop(1)).map { case (x, y) => x - y }
// in case you don't like the extractor method of dealing with Tuples
list.zip(list.drop(1)).map(p => p._1 - p._2)
答案 3 :(得分:3)
效率不高(为每对相邻数字创建一个两元素列表),但
list.sliding(2).map(x=>(x(0)-x(1)))
应该给你你想要的东西。
答案 4 :(得分:3)
对于那些喜欢对地图进行理解的人来说,不介意提取器并喜欢命名中间结果:
for (List(current, next) <- list.sliding(2);
delta = current - next)
yield delta
答案 5 :(得分:1)
递归方式:
scala> def calcDeltas(l:List[Int]):List[Int] = l match {
| case Nil => Nil
| case x::Nil => Nil
| case x::y::Nil => (x-y)::Nil
| case x::y::tail => (x-y)::calcDeltas(y::tail)
| }