【问题标题】:Using groupBy on a List of Tuples in Scala在 Scala 的元组列表上使用 groupBy
【发布时间】:2018-05-20 22:14:46
【问题描述】:

我尝试在 Scala 中对元组列表进行分组。

输入:

val a = List((1,"a"), (2,"b"), (3,"c"), (1,"A"), (2,"B"))

我申请了:

a.groupBy(e => e._1)

我得到的输出是:

Map[Int,List[(Int, String)]] = Map(2 -> List((2,b), (2,B)), 1 -> List((1,a), (1,A)), 3 -> List((3,c)))

这与我的预期略有不同:

Map[Int,List[(Int, String)]] = Map(2 -> List(b, B), 1 -> List(a, A)), 3 -> List(c))

我该怎么做才能获得预期的输出?

【问题讨论】:

  • 令人惊讶的是,不是this here 的重复,接受的答案正是回答了实际问题。

标签: scala


【解决方案1】:

你的意思可能是这样的:

a.groupBy(_._1).mapValues(_.map(_._2))

或:

a.groupBy(_._1).mapValues(_.unzip._2)

结果:

Map(2 -> List(b, B), 1 -> List(a, A), 3 -> List(c))

【讨论】:

  • 谢谢。这适用于我的目的。是否有另一种方法可以应用 groupBy 来避免使用 mapValues?
  • @ZZZ 由于List[A] 上的groupBy 将返回Map[K, List[A]],似乎没有办法绕过它,因为List[(X, Y)] 将始终转换为Map[K, List[(X, Y)]] 而不是@987654329 @。所以,不,你必须mapValues。我添加了另一个,希望更美观的变体。
【解决方案2】:

如果您不想使用 mapValues,这是您所期望的吗?

 a.groupBy(_._1).map(f => (f._1, f._2.map(_._2)))

结果

Map(2 -> List(b, B), 1 -> List(a, A), 3 -> List(c))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2023-03-19
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多