如何将数字列表映射到Scala中的增量列表?

时间:2011-11-11 18:47:57

标签: scala list-comprehension

假设我有一个数字列表。如何将列表转换为其“增量”列表 - 后续数字的成对差异?

例如:给定List(5, 2, 1, 1)我想获得List(3, 1, 0)

6 个答案:

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