Scala:如何总结元组列表

时间:2015-05-10 17:56:27

标签: scala

给出以下元组列表......

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

...如何将所有值相加并获得这样的单个元组?

(3, 6)

5 个答案:

答案 0 :(得分:19)

使用foldLeft方法。有关详细信息,请查看scaladoc

scala> val list = List((1, 2), (1, 2), (1, 2))
list: List[(Int, Int)] = List((1,2), (1,2), (1,2))

scala> list.foldLeft((0, 0)) { case ((accA, accB), (a, b)) => (accA + a, accB + b) }
res0: (Int, Int) = (3,6)

使用unzip。不如上述解决方案有效。也许更具可读性。

scala> list.unzip match { case (l1, l2) => (l1.sum, l2.sum) }
res1: (Int, Int) = (3,6) 

答案 1 :(得分:11)

非常简单:(list.map(_._1).sum, list.map(_._2).sum)

答案 2 :(得分:1)

您可以使用Monoid.combineAll库中的cats解决此问题:

import cats.instances.int._ // For monoid instances for `Int`
import cats.instances.tuple._  // for Monoid instance for `Tuple2`
import cats.Monoid.combineAll

  def main(args: Array[String]): Unit = {

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

    val res = combineAll(list)

    println(res)
    // Displays
    // (3, 6)
  }

您可以在cats documentationScala with Cats中查看有关此内容的更多信息。

答案 3 :(得分:1)

Scalaz解决方案(由Travis建议,由于某种原因删除了答案):

recommended

输出

import scalaz._
import Scalaz._

val list = List((1, 2), (1, 2), (1, 2))
list.suml

答案 4 :(得分:0)

在尝试了解spark中的聚合函数时回答此问题

scala> val list = List((1, 2), (1, 2), (1, 2))
list: List[(Int, Int)] = List((1,2), (1,2), (1,2))

   scala>  list.aggregate((0,0))((x,y)=>((y._1+x._1),(x._2+y._2)),(x,y)=>(x._1+y._2,y._2+x._2))
res89: (Int, Int) = (3,6)

以下是SO QA的链接,有助于理解和回答此问题[Explain the aggregate functionality in Spark