【问题标题】:Group list of tuples and sum the integers对元组列表进行分组并对整数求和
【发布时间】:2021-11-23 08:55:54
【问题描述】:

我有以下清单:

List(List(("hello", "goodbye", 12), ("hello", "goodbye", 15)), List(("hello", "test", 18), ("hello", "test", 20)), List(("something", "different", 30), ("something", "different", 18)))

我想得到以下结果:

List(("hello", "goodbye", 27), ("hello", "test", 38), ("something", "different", 48))

我尝试使用 .map 和 .groupBy,但我似乎找不到让它工作的方法。

【问题讨论】:

  • 您之前似乎已经进行了某种分组?如果您可以向我们展示您所做的工作以及原始数据的外观以及您的 Scala 版本是什么,我们可能会提出更好的解决方案。 - 无论如何,使用您当前的模型,您只需 map 外部列表即可将每个内部列表转换为单个元素,例如:outerList.map(_.reduce { case ((a, b, n1), (_, _, n2)) => (a, b, n1 + n2) })

标签: list scala tuples


【解决方案1】:

只要结果元素的顺序不重要,这似乎就能得到你想要的。

val data =
  List(List(("hello", "goodbye", 12), ("hello", "goodbye", 15)), List(("hello", "test", 18), ("hello", "test", 20)), List(("something", "different", 30), ("something", "different", 18)))

data.flatten
    .groupMapReduce(tup => (tup._1,tup._2))(_._3)(_+_)
    .map{case ((k1,k2),v) => (k1,k2,v)}
    .toList
//res0: List[(String, String, Int)] =
// List((hello,test,38), (something,different,48), (hello,goodbye,27))

请注意,我 flatten 去掉了所有内部子列表,只关注元组中的 String 元素。这是否是您的意图尚不完全清楚。

【讨论】:

    【解决方案2】:

    你可以:

    1. 将这些列表合并为一个列表
    2. 按每个列表的前两个元素分组
    3. 减少每组中每个列表的第三个元素
    val list = List(
      List(("hello", "goodbye", 12), ("hello", "goodbye", 15)),
      List(("hello", "test", 18), ("hello", "test", 20)),
      List(("something", "different", 30), ("something", "different", 18))
    )
    
    val result = list.flatten.groupBy { case (s1, s2, _) => (s1, s2) }.values.map(_.reduce((s1, s2) => (s1._1, s1._2, s1._3 + s2._3)))
    // List((hello,test,38), (hello,goodbye,27), (something,different,48))
    

    【讨论】:

      【解决方案3】:

      如果内部列表可以有不同的“键” - 您可以使用 flatMap(identity)flatten 展平列表列表,然后使用元组的前两个元素对结果进行分组,并使用 sum 减少分组:

      val collection = ...
      collection
          .flatten
          .groupMapReduce(t => (t._1, t._2))(identity)((l,r) => (l._1, l._2, l._3+r._3))
          .values
          .toList
      

      【讨论】:

        猜你喜欢
        • 2014-10-20
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 2015-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多