35

I am trying to split Scala list like List(1,2,3,4) into pairs (1,2) (2,3) (3,4), what's a simple way to do this?

Garrett Hall
  • 28,716
  • 10
  • 59
  • 74

3 Answers3

80
val xs = List(1,2,3,4)
xs zip xs.tail
  // res1: List[(Int, Int)] = List((1,2), (2,3), (3,4))

As the docs say, zip

Returns a list formed from this list and another iterable collection by combining corresponding elements in pairs. If one of the two collections is longer than the other, its remaining elements are ignored.

So List('a,'b,'c,'d) zipped with List('x,'y,'z) is List(('a,'x), ('b,'y), ('c,'z)) with the final 'd of the first one ignored.

From your example, the tail of List(1,2,3,4) is List(2,3,4) so you can see how these zip together in pairs.

Luigi Plinge
  • 49,776
  • 19
  • 109
  • 178
17

To produce a list of pairs (i.e. tuples) try this

List(1,2,3,4,5).sliding(2).collect{case List(a,b) => (a,b)}.toList
Jakob Odersky
  • 1,291
  • 11
  • 22
  • 3
    Use `map` instead of `collect` — this will save an `isDefinedAt` call and throw an exception if all of a sudden your original collection is not a `List` any more, instead of silently producing an empty result. For this same reason, you should probably pattern-match `Seq(a,b)` instead of `List(a,b)`. – Jean-Philippe Pellet Jun 28 '12 at 16:43
9
List(1,2,3,4).sliding(2).map(x => (x.head, x.tail.head)).toList
res0: List[(Int, Int)] = List((1,2), (2,3), (3,4))
Brian
  • 19,947
  • 6
  • 34
  • 53
  • 1
    This is the answer I came up as well when I wrote it. Seems more obvious and readable than the rest imo. – arviman Jul 25 '17 at 13:45
  • @arviman This is what I came up with at the time. I was probably trying to force the use of `sliding`. In hindsight, the accepted answer is much better. – Brian Jul 25 '17 at 13:50