2014-09-16 3 views
0

Если у меня естьманипулировать список кортежей в общем виде Скале

List((1,2),(1,3),(1,4)) 

и хочу, чтобы преобразовать его в

List((1,List(2,3,4)) 

я

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

val groups = list groupBy { case (a, b) => a } 

val tups = groups map { case ((a), list) => (a, list.map(_._2)) } 
tups.toList 

, который работает, но при попытке посмотреть если есть какой-либо другой (лучший) способ?

+3

Я думаю, что это примерно так же просто, как может получиться – Gangstead

+0

см. [How-to-build-a-multimap-from-a-list-of-tuples-in-scala] (http://stackoverflow.com/questions/7209807/как к Построй-MultiMap-из-а-список-оф-кортежей-в-Скале) – roterl

ответ

1

Немного проще, может быть, и делает это в один проход:

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 (вариант Владимира, но короче):

list.groupBy(_._1).mapValues(_.unzip._2) 
1

Я считаю, что это коротким как это возможно возможно:

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))) 

Для этого требуется несколько проходов, но для небольших и средних списков оно не имеет большого значения.

Смежные вопросы