以scala的通用方式操作元组列表

以scala的通用方式操作元组列表,scala,Scala,如果我有 List((1,2),(1,3),(1,4)) 想把它转换成 List((1,List(2,3,4)) 我知道 哪种方法有效,但试着看看是否有其他(更好的)方法?可能简单一点,一次完成: val list = List((1, 2), (1, 3), (1, 4), (2, 5), (2, 6)) list.foldRight(Map[Int,List[Int]]()) { case ((k, v), m) => m updated (k, v ::

如果我有

List((1,2),(1,3),(1,4))
想把它转换成

List((1,List(2,3,4))
我知道


哪种方法有效,但试着看看是否有其他(更好的)方法?

可能简单一点,一次完成:

  val list = List((1, 2), (1, 3), (1, 4), (2, 5), (2, 6))

  list.foldRight(Map[Int,List[Int]]()) { case ((k, v), m) =>
       m updated (k, v :: (m getOrElse (k, Nil))) }

  //> res1: scala.collection.immutable.Map[Int,List[Int]] = Map(2 -> List(5, 6), 1
  //|  -> List(2, 3, 4))
我的codegolf条目(Vladimir的变体,但较短):


我相信这是最简短的:

scala> val l = List((1, 2), (1, 3), (1, 4))
l: List[(Int, Int)] = List((1,2), (1,3), (1,4))

scala> l.groupBy(_._1).mapValues(_.map(_._2)).toList
res0: List[(Int, List[Int])] = List((1,List(2, 3, 4)))

它确实需要多次通过,但对于中小型列表来说,这并不重要。

我认为这是最简单的
list.groupBy(_._1).mapValues(_.unzip._2)  
scala> val l = List((1, 2), (1, 3), (1, 4))
l: List[(Int, Int)] = List((1,2), (1,3), (1,4))

scala> l.groupBy(_._1).mapValues(_.map(_._2)).toList
res0: List[(Int, List[Int])] = List((1,List(2, 3, 4)))